如何在类构造函数中初始化数组?

4

Mac OS X Leopard上使用Xcode编写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;这一行可以解决问题。看起来我没有正确地进行赋值。我该如何解决这个问题?
编辑:
变量bars是一个字符串数组。在主函数中,我像这样初始化它:
string bars[] = {"bar1", "bar2", "bar3"};

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


1
首先,在符合ISO C++标准的代码中,声明string bars[]本身就是一个错误 - 你的编译器允许你这样做(而且,根据错误信息判断,将其视为string bars[0]),这意味着它将其作为扩展提供。 - Pavel Minaev
2个回答

8

数组表现得像常量指针,不能将指针分配给它们。您也不能直接将数组彼此分配。

您可以选择

  • 使用指针成员变量
  • 有一个固定大小的bar,并使用其内容初始化成员数组
  • 只需使用对std容器的引用,例如std::vector

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)
{
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接