2009-09-23 3 views
4

Работа в Xcode на Mac OS X Leopard в C++:Как инициализировать массив в конструкторе класса?

У меня есть следующий код:

class Foo{ 

private: 
    string bars[]; 

public: 
    Foo(string initial_bars[]){ 
     bars = initial_bars; 
    } 
} 

Это не компилируется и выдает следующее сообщение об ошибке:

error: incompatible types in assignment of 'std::string*' to 'std::string [0u]' 

Я заметил, что удаление строки bars = initial_bars; решает проблему. Кажется, что я неправильно выполняю задание. Как я могу решить эту проблему?

EDIT:

Переменные бары представляет собой массив строк. В основной функции я инициализирую его следующим образом:

string bars[] = {"bar1", "bar2", "bar3"}; 

Но он может содержать произвольное количество членов.

+1

Для начала, декларация 'string bars []' self - это ошибка в коде, совместимом с ISO C++, - тот факт, что ваш компилятор позволяет вам это сделать (и, судя по сообщению об ошибке, рассматривает его как 'string bars [0]'), означает, что он предлагает это как расширение. –

ответ

8

Массивы ведут себя как константные указатели, вы не можете назначать им указатели. Вы также не можете напрямую назначать массивы друг другу.

Вы либо

  • использовать переменную-член указатель
  • имеют фиксированный размер bar s вы получаете и инициализировать массив члена с его содержанием
  • просто использовать ссылку на std контейнер, как std::vector
+0

большое спасибо! используемых векторов, и он решил проблему –

1

Элементы массива «значение-инициализировать» можно следующим образом:

class A { 
public: 
    A() 
    : m_array()  // Initializes all members to '0' in this case 
    { 
    } 

private: 
    int m_array[10]; 
}; 

Для POD типов это важно, так как если вы не перечисляют «m_array» в списке инициализации членов, то элементы массива будут иметь неопределенные значения.

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

A (std::vector<int> const & v) 
// : m_v() // 'm_v' is implicitly initialized here 
{ 
    m_v = v; // 'm_v' now assigned to again 
} 

Более эффективно написано как:

A (std::vector<int> const & v) 
: m_v (v) 
{ 
} 
Смежные вопросы