C ++: конструктор инициализатора для массивов - PullRequest
62 голосов
/ 09 марта 2010

У меня болит мозг ... как правильно инициализировать массив объектов в C ++?

пример без массива:

struct Foo { Foo(int x) { /* ... */  } };

struct Bar { 
     Foo foo;

     Bar() : foo(4) {}
};

Пример массива:

struct Foo { Foo(int x) { /* ... */  } };

struct Baz { 
     Foo foo[3];

     // ??? I know the following syntax is wrong, but what's correct?
     Baz() : foo[0](4), foo[1](5), foo[2](6) {}
};

edit: Дикие и сумасшедшие идеи обходного пути приветствуются, но они не помогут мне в моем случае. Я работаю над встроенным процессором, где std :: vector и другие конструкции STL недоступны, и очевидным обходным решением является создание конструктора по умолчанию и наличие явного init() метода, который можно вызывать после времени создания, Мне не нужно использовать инициализаторы вообще. (Это один из тех случаев, когда меня избаловало ключевое слово Java final + гибкость с конструкторами.)

Ответы [ 14 ]

0 голосов
/ 13 января 2016

в visual studio 2012 или выше, вы можете сделать так

struct Foo { Foo(int x) { /* ... */  } };

struct Baz { 
     Foo foo[3];

     Baz() : foo() { }
};
0 голосов
/ 10 июня 2013
class C
{
   static const int myARRAY[10];  // only declaration !!!

   public:
   C(){}
   }

const int C::myARRAY[10]={0,1,2,3,4,5,6,7,8,9};  // here is definition

int main(void)
{
   C myObj;
   }
0 голосов
/ 09 марта 2010

Идеи из искаженного ума:

class mytwistedclass{
static std::vector<int> initVector;
mytwistedclass()
{
    //initialise with initVector[0] and then delete it :-)
}

};

Теперь установите initVector на то, что вы хотите, прежде чем создавать объект. Затем ваши объекты инициализируются с вашими параметрами.

0 голосов
/ 09 марта 2010

Нет синтаксиса построения массива, который можно было бы использовать в этом контексте, по крайней мере, не напрямую. Вы можете выполнить то, что пытаетесь достичь, с помощью чего-то вроде:

Bar::Bar()
{
    static const int inits [] = {4,5,6};
    static const size_t numInits = sizeof(inits)/sizeof(inits[0]);
    std::copy(&inits[0],&inits[numInits],foo);  // be careful that there are enough slots in foo
}

... но вам нужно дать Foo конструктор по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...