פורסם: 20/06/2018 - 12:49
נושא ההודעה: הקוד מחזיר שגיאה
|
קוד: |
'c_box' does not name a type |
קוד: | #include<iostream>
#include<vector>
using namespace std;
class box {
public:
int hor
,ver;
};
box c_box;
c_box.hor = 1;
c_box.ver = 1;
int main (){
} |
איפה הבעיה?
|
|
חזרה לתוכן הדיון |
פורסם: 20/06/2018 - 12:59
נושא ההודעה:
|
הרכזה צריכה להיות בתוך ה פונקציה.
קוד: | class box {
public:
int hor:
int ver;
};
int main (){
box c_box;
c_box.hor = 1;
c_box.ver = 1;
} |
|
|
חזרה לתוכן הדיון |
פורסם: 20/06/2018 - 17:45
נושא ההודעה: מה האפליה
|
מה האפליה שאפשר להכריז אבל אי אפשר להשתמש בממברס?
|
|
חזרה לתוכן הדיון |
פורסם: 21/06/2018 - 07:00
נושא ההודעה:
|
מחוץ לפונקציות לא יכול להיות קוד. אתה עדיין יכול להקצות שם זכרון: אתה יכול להגדיר באיזה מקום יישב המשתנה c_box (ואצלך הוא גלובלי לכל התוכנית ואפילו לא סטטי לקובץ, שזה גם לא דבר מומלץ). אבל רק פונקציות מגדירות מה עושים איתו.
|
|
חזרה לתוכן הדיון |
פורסם: 21/06/2018 - 15:39
נושא ההודעה:
|
לא רק הגדרה אלא גם אתחול סטטי (שמגיע עם ההגדרה) מותרים מחוץ לפונקציה. בC++ זה כולל גם אתחול באמצעות קונסטרקטור, יש הטוענים שזה לא מומלץ.
|
|
חזרה לתוכן הדיון |
פורסם: 22/06/2018 - 16:11
נושא ההודעה:
|
Anonymous : | לא רק הגדרה אלא גם אתחול סטטי (שמגיע עם ההגדרה) מותרים מחוץ לפונקציה. בC++ זה כולל גם אתחול באמצעות קונסטרקטור, יש הטוענים שזה לא מומלץ. |
אבל הוא לא עשה איתחול סטטי .
אתחול סטטי יראה כך :
קוד: |
#include<iostream>
#include<vector>
using namespace std;
class box {
public:
int hor
,ver;
};
static box c_box = {1,1};
int main (){
return 0;
} |
(שים לב לסינטקסט), שימוש בממבר בצורה שהוא עשה דורש זמן ריצה .
|
|
חזרה לתוכן הדיון |
פורסם: 24/06/2018 - 08:47
נושא ההודעה:
|
Anonymous : | Anonymous : | לא רק הגדרה אלא גם אתחול סטטי (שמגיע עם ההגדרה) מותרים מחוץ לפונקציה. בC++ זה כולל גם אתחול באמצעות קונסטרקטור, יש הטוענים שזה לא מומלץ. |
אבל הוא לא עשה איתחול סטטי .
אתחול סטטי יראה כך :
קוד: |
#include<iostream>
#include<vector>
using namespace std;
class box {
public:
int hor
,ver;
};
static box c_box = {1,1};
int main (){
return 0;
} |
(שים לב לסינטקסט), שימוש בממבר בצורה שהוא עשה דורש זמן ריצה . |
בהנחה שמדובר במשתנה אחד שאמור להיות מוצב (שלא כמו בתוכנית כאן שיש 2) , איתחול בקונסטרקטור, צורך פחות זמן ריצה מאתחול רגיל?
|
|
חזרה לתוכן הדיון |
פורסם: 24/06/2018 - 09:48
נושא ההודעה:
|
תלוי בקומפיילר תאורטית אבל מבחינה מעשית זה חסר משמעות
|
|
חזרה לתוכן הדיון |
פורסם: 26/06/2018 - 12:06
נושא ההודעה:
|
Anonymous : | לא רק הגדרה אלא גם אתחול סטטי (שמגיע עם ההגדרה) מותרים מחוץ לפונקציה. בC++ זה כולל גם אתחול באמצעות קונסטרקטור, יש הטוענים שזה לא מומלץ. |
איך זה שאיתחול באמצעות קונסטרקטור אפשר לעשות מחוץ לפונקציה? אם אני זוכר נכון (עשרות שנים לא נגעתי בזה) מה שעושים מחוץ לפונקציה מגדיר את סגמנט הנתונים, ובו אין קוד ביצועי. אם אני משתמש בקונסטרקטור, מי מריץ אותו ומתי?
|
|
חזרה לתוכן הדיון |
פורסם: 26/06/2018 - 17:55
נושא ההודעה:
|
הקומפיילר יכול לדאוג לביצוע קונסטרקטור לפני הפונקציה הראשית. כאמור, זה לא מומלץ
|
|
חזרה לתוכן הדיון |
פורסם: 26/06/2018 - 21:48
נושא ההודעה:
|
Anonymous : | הקומפיילר יכול לדאוג לביצוע קונסטרקטור לפני הפונקציה הראשית. כאמור, זה לא מומלץ |
ואם הקוד מצוי ב- shared library מה יקרה? היישום שטוען את הספרייה, איך הוא יקרא לקוד האיתחול הזה?
(זה לא שאני רוצה להטריח אותך עם שאלות מעצבנות. זה פשוט מעניין. עשיתי חיפוש חפוז בגוגל אך נראה שאני בכלל לא יודע באילו מלים להשתמש (עברו הרבה שנים מאז שנגעתי בדברים האלה).)
|
|
חזרה לתוכן הדיון |
פורסם: 27/06/2018 - 09:20
נושא ההודעה:
|
ירחמיאל : | Anonymous : | לא רק הגדרה אלא גם אתחול סטטי (שמגיע עם ההגדרה) מותרים מחוץ לפונקציה. בC++ זה כולל גם אתחול באמצעות קונסטרקטור, יש הטוענים שזה לא מומלץ. |
איך זה שאיתחול באמצעות קונסטרקטור אפשר לעשות מחוץ לפונקציה? אם אני זוכר נכון (עשרות שנים לא נגעתי בזה) מה שעושים מחוץ לפונקציה מגדיר את סגמנט הנתונים, ובו אין קוד ביצועי. אם אני משתמש בקונסטרקטור, מי מריץ אותו ומתי? |
איתחול בקונסטרטור לא יכול להיות מחוץ לבלוק (פונקציה), יש הבדל מאוד ברור בין הכרזה ואיתחול (זה למה אתה רואה איתחול סטטי בקוד ישן מחוץ ל class.
|
|
חזרה לתוכן הדיון |
פורסם: 27/06/2018 - 18:01
נושא ההודעה:
|
Anonymous : | ירחמיאל : | איך זה שאיתחול באמצעות קונסטרקטור אפשר לעשות מחוץ לפונקציה? אם אני זוכר נכון (עשרות שנים לא נגעתי בזה) מה שעושים מחוץ לפונקציה מגדיר את סגמנט הנתונים, ובו אין קוד ביצועי. אם אני משתמש בקונסטרקטור, מי מריץ אותו ומתי? |
איתחול בקונסטרטור לא יכול להיות מחוץ לבלוק (פונקציה), |
מסתבר שאפשר! על זה אנחנו מדברים.
הרצתי את הקוד הבא:
קוד: |
#include <stdio.h>
int calculate() {
return 111;
}
class Obj {
public:
int a;
Obj(int _a) { a = _a * 222; }
};
Obj z(666);
int result = calculate();
int result_2 = result + 777;
int main() {
printf("%d\n", result_2);
return 0;
}
|
והוא מדפיס "888". מגניב, לא?
(אולי היכולת הזו היא הרחבה של GNU ולא קיימת ב-C++ סטנדרטי?)
בחנתי את פלט האסמבלי, בעזרת:
ואני רואה שהמהדר שם את הקוד שמאתחל את סגמנט הנתונים בפונקציה נפרדת (בשם _Z41__static_initialization_and_destruction_0ii). אבל אני לא רואה איפה קוראים לפונקציה הזו. הפונקציה main לא קוראת לה. אולי הלינקר איכשהו יודע לקרוא לפונקציה הזו? מעניין איך זה מתבצע...
|
|
חזרה לתוכן הדיון |
פורסם: 27/06/2018 - 19:20
נושא ההודעה:
|
הקוד שלך לא תקני בעליל (זה לא C ולא C++).
ואתה לא מנסה לגשת למידע (בשונה ממקודם):
אתה צריך להבין את ההבדל בין :
ל:
קוד: |
Obj z(666);
z.a = 666; |
Declaration , Definition ו Initialization
וכמובן http://www.informit.com/articles/article.aspx?p=1852519
ולשואל המקורי :
קוד: | struct box { int x; int y; int z; };
box c_box{.x = 1, .z = 2}; |
|
|
חזרה לתוכן הדיון |
|