在构造函数的初始化列表中初始化数组

5

我正在尝试在构造函数的初始化列表中初始化一个数组,我希望这个数组的大小为MAX_SIZE,在我的Stack类中这是一个公共的静态常量。我该怎么做才能让它工作?编译器抱怨说在将“double”分配给“double [0u]”时它们具有不兼容的类型。

这是我的代码:

class Stack {
    public:      
          Stack();
          static const unsigned MAX_SIZE; 
    private:
          double array[];
          unsigned elements;     
    };  // class Stack

    Stack::Stack(): array( array[MAX_SIZE] ), elements(0) {}

    const unsigned Stack::MAX_SIZE = 4;

感谢您提前的帮助。


2
除非你完全是受虐狂:static const unsigned max_size = 4; std::vector<double> array; Stack::Stack() : array(MAX_SIZE){} - Jerry Coffin
1
有没有更简单的方法呢?例如,不使用向量。我该如何让程序接受我的数组数据成员,并使其大小为MAX_SIZE? - Sean
我会习惯使用 std::vector。我很少使用数组;几乎每次都会优先使用 std::vector。@Jesse Good 给出的代码也应该可以工作。 - Jerry Coffin
1
避免使用向量的理由是有合理的。向量总是在堆上初始化,而数组可以在堆栈上初始化。 - Anupam Srivastava
1个回答

5
 class Stack {
        public:
              Stack();
              static const unsigned MAX_SIZE = 4;
        private:
              double array[MAX_SIZE];
              unsigned elements;
        };  // class Stack

 Stack::Stack():  array(), elements(0) {}

但是,如评论中所提到的,std::vector会更好。

1
我之所以问这个问题是因为我在这里读到了不同的观点,即定义应该在类外部:http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr038.htm - Sean
1
@mezhaka:是的,这种形式被称为“值初始化”。 - Jesse Good
抱歉重新提出一个旧问题,但我正在学习C++并尝试实现一个堆栈以便学习。所以在C++中,你必须在private下初始化数组的大小吗?你不能在构造函数中完成吗?我是一个C#/Java的人,所以这对我来说似乎完全相反。 - Kevin
@Kev:private只是访问说明符,但是你需要像上面展示的那样指定大小。在C#/Java中,数组是引用类型,对吗?当你在这些语言中创建一个数组时,对象被分配在托管堆上,而不是你的类中。这就是为什么你可以在这些语言的构造函数中这样做的原因。在C++中,当你有一个数组作为类的成员时,该数组的存储空间存在于任何类型为“Stack”的对象内部,因此在构造函数运行之前必须知道其大小。 - Jesse Good
@JesseGood 感谢您的解释!昨晚我花了好几个小时试图在C++构造函数中设置数组大小...糟糕 :)。 - Kevin
显示剩余4条评论

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