سؤال

class C 
{
public:
 C() : arr({1,2,3}) //doesn't compile
{}
    /*
    C() : arr{1,2,3} //doesn't compile either
{}
    */
private:
 int arr[3];
};

أعتقد أن السبب هو أنه يمكن تهيئة المصفوفات فقط مع = بناء الجملة ، وهذا هو:

int arr[3] = {1,3,4};

أسئلة

  1. كيف يمكنني أن أفعل ما أريد أن أفعله (هذا هو ، تهيئة صفيف في مُنشئ (عدم تعيين عناصر في الجسم)). هل هذا ممكن؟
  2. هل يقول معيار C ++ 03 أي شيء خاص حول تهيئة المجاميع (بما في ذلك المصفوفات) في المهيئات CTOR؟ أو عدم إبطال الكود أعلاه هو طائرة طبيعية لبعض القواعد الأخرى؟
  3. هل C ++ 0x قوائم التهيئة تحل المشكلة؟

ملاحظة من فضلك لا تذكر المتجهات ، Boost :: Arrays ، وتفوقها على المصفوفات ، التي أدركها جيدًا.

هل كانت مفيدة؟

المحلول

  1. كيف يمكنني أن أفعل ما أريد أن أفعله (أي تهيئة صفيف في مُنشئ (عدم تعيين عناصر في الجسم)). هل هذا ممكن؟

نعم. إنه يستخدم بنية تحتوي على صفيف. أنت تقول أنك تعرف ذلك بالفعل ، لكنني لا أفهم السؤال. بهذه الطريقة ، أنت فعل تهيئة صفيف في المنشئ ، دون مهام في الجسم. هذا هو ما boost::array يفعل.

هل يقول معيار C ++ 03 أي شيء خاص حول تهيئة المجاميع (بما في ذلك المصفوفات) في المهيئات CTOR؟ أو عدم إبطال الكود أعلاه هو طائرة طبيعية لبعض القواعد الأخرى؟

يستخدم Mem-Initializer التهيئة المباشرة. وقواعد البند 8 لا سمح هذا النوع من الأشياء. لست متأكدًا تمامًا من الحالة التالية ، لكن بعض المترجمين يسمحون بذلك.

struct A {
  char foo[6];
  A():foo("hello") { } /* valid? */
};

نرى هذا GCC PR لمزيد من التفاصيل.

هل C ++ 0x قوائم التهيئة تحل المشكلة؟

نعم ، يفعلون. ومع ذلك ، فإن بناء الجملة الخاص بك غير صالح ، على ما أعتقد. يجب عليك استخدام الأقواس مباشرة لإطلاق التهيئة القائمة

struct A {
  int foo[3];
  A():foo{1, 2, 3} { }
  A():foo({1, 2, 3}) { } /* invalid */
};

نصائح أخرى

لا يوفر C ++ 98 بناء جملة مباشرة لأي شيء سوى الصفر (أو للعناصر غير POD ، ذات القيمة المفروضة على القيمة) الصفيف. لذلك تكتب للتو C(): arr() {}.

أنا شيء على ما يرام في Roger Pate حول القيود المزعومة للتهيئة الإجمالية C ++ 0x ، لكنني كسول جدًا لأبحث عنه أو التحقق منه ، ولا يهم ، أليس كذلك؟ تعديل: كان روجر يتحدث عن "C ++ 03" ، لقد أخطأت في قراءة "C ++ 0x". آسف ، روجر. ☺

A C ++ 98 حلًا للرمز الحالي هو لف المصفوفة في أ struct وتهيئته من ثابت ثابت من هذا النوع. يجب أن تتواجد البيانات في مكان ما على أي حال. خارج الكفة يمكن أن تبدو هكذا:

class C 
{
public:
    C() : arr( arrData ) {}

private:
     struct Arr{ int elem[3]; };
     Arr arr;
     static Arr const arrData;
};

C::Arr const C::arrData = {{1, 2, 3}};

الحل البديل:

template<class T, size_t N>
struct simple_array { // like std::array in C++0x
   T arr[N];
};


class C : private simple_array<int, 3> 
{
      static simple_array<int, 3> myarr() {
           simple_array<int, 3> arr = {1,2,3};
           return arr;
      }
public:
      C() : simple_array<int, 3>(myarr()) {}
};
  1. لا للأسف.
  2. لا يمكنك فقط بالطريقة التي تريدها ، حيث لا يسمح بها القواعد (المزيد أدناه). يمكنك فقط استخدام التهيئة التي تشبه CTOR ، وكما تعلم ، هذا غير متوفر لتهيئة كل عنصر في المصفوفات.
  3. أعتقد ذلك ، لأنها تعميم التهيئة في جميع المجالات بطرق عديدة مفيدة. لكنني لست متأكدًا من التفاصيل.

في C ++ 03 ، ينطبق التهيئة الإجمالية فقط مع بناء الجملة على النحو التالي ، والتي يجب أن تكون عبارة منفصلة ولا تتناسب مع مُهيئ CTOR.

T var = {...};

ماذا عن

...
  C() : arr{ {1,2,3} }
{}
...

?

يجمع غرامة على G ++ 4.8

تريد أن تبدأ مجموعة من ints في مُنشرك؟ أوجهها إلى صفيف ثابت.

class C 
{
public:
    int *cArray;

};

C::C {
    static int c_init[]{1,2,3};
    cArray = c_init;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top