קוד: |
intc_ptr = new intc[100]; |
קוד: |
intc_ptr = new intc[100](45) |
קוד: |
ISO C++ forbids initialization in array |
Anonymous : |
אין כזה דבר מערך דינאמי של אובייקטים. או שזה מערך (כלומר לא דינאמי) או שזה מחלקה שמממשת מערך דינאמי ואז אתה מאתחל את זה כמו מחלקה. |
C++ist : | ||||||
1) שאלה: ביצירת מערך דינמי של מספר אובייקטים עם "קונסטרוקטור", מצד אחד אם לא מאתחלים את האובייקטים מתקבלת שגיאה, שהרי יש "קונסטרוקטור" באובייקטים האמור לקבל ערך בשעת יצירת האובייקט, וכאן הוא לא מתקבל. מצד שני אם כן מאתחלים עם ערך מתקבלת שגיאה שהדבר אסור על פי תקן ISO. כיצד פותרים את הבעיה?.
לדוגמה נניח ש-intc היא מחלקה
יביא לשגיאה כי אין ערך לקונסטרוקטור ומצד שני
יביא לשגיאה הבאה:
|
קוד: |
auto arr = std::array<intc, 10>{1,2,3,4,5,42,42,42,42,42}; |
קוד: |
auto vec1 = std::vector<intc>{1,2,3,4,5,42,42,42,42,42};
auto vec2 = std::vector<intc>(100,42); |
borsood : |
std::array ו std::vector עדיפות תמיד.
לא משתמשים במערכים של C בקוד חדש. |
עמית : | ||
נכון שבדרך כלל זו הדרך העדיפה, אבל עדיין יש מקרים, כמו כתיבה של קוד low-level, בהם הדבר הנכון הוא הקצאה ישירה של זיכרון. |
ציטוט: |
אם אתה כותב "low level" ועושה את זה ב C++ אתה יורה בהעתקים של הרגל שלך. |
עמית : | ||
אני לא מסכים אתך. נכון שכל מתכנת שכותב ב-C++ צריך לשאוף להשתמש כמה שיותר בספריות הקיימות ולא להמציא את הגלגל מחדש, וזה אפשרי, כנראה, ברוב המקרים. עדיין עשויים להיות מקרים מסויימים, למשל שתרצה לכתוב בעצמך container class שלא קיים ב-STL, או שיהיו לך אילוצים של חומרה מסוימת, בהם תרצה לעשות, למשל, הקצאות זיכרון בעצמך. |
קוד: |
extern void f1(int8_t * ptr,size_t count_of_elements); void foo()} std::vector <int8_t> v; v.resize(1000); f1(v.data(),v.size()); { |