2009-09-23 34 views
4

在C++上Mac OS X LeopardXcode工作:如何初始化一个类的构造函数中的数组?

我有以下代码:

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;解决了这个问题。 看来我没有正确地完成任务。我怎么能解决这个问题呢?

编辑:

变量栏是一个字符串数组。在主函数中我这样初始化:

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

但它可以包含任意数量的成员。

+1

对于初学者来说,申报'string bars []'本身在ISO C++兼容代码中是一个错误 - 事实上你的编译器允许你这样做(并且根据错误消息判断它被视为'string bars [0]')意味着它提供了作为扩展。 – 2009-09-24 16:30:56

回答

8

数组的行为与const指针类似,您不能为它们指定指针。你也不能直接给对方分配数组。

你要么

  • 使用指针成员变量
  • bar你所得到和其内容初始化成员数组
  • 只使用一个基准像std::vector一个std容器固定大小
+0

非常感谢!用过的矢量,它解决了这个问题 – 2009-09-24 00:10:47

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) 
{ 
} 
相关问题