0

我还不了解用于在构造函数初始化程序列表中初始化数组的新 C++11 语法。我不再坚持使用 C++03,但由于程序限制,我不能使用 boost 或 std::vector。

FOO 的实例必须通过构造函数调用来确定大小,并且表现得好像 x 和 y 的大小是静态已知的。新的 C++11 特性是否允许这样做?

我不确定是否或如何std::initializer_list<>提供帮助。

class FOO
{
public:
    // this constructor needs to size x = count and y = count * 4
    FOO(int count) : 
    {
        // interate over x and y to give them their initial and permenent values
    }
private:
    const BAR x[];
    const TAR y[];
};

#include "foo.h"
void main(void)
{
    // both need to work as expected
    FOO alpha(30);
    FOO * bravo = new FOO(44);
}
4

2 回答 2

3

你不能做你想做的事。数组的大小必须是编译时常量。虽然在您的特定用例中提供给构造函数的值可能是编译时常量,但 C++ 无法知道这一点。

此外,作为一种静态类型语言,C++ 需要能够在编译时计算类的大小。sizeof(Foo)需要有一个精确的、单一的值。而你的不能。

初始化列表不会帮助你。您需要两个运行时大小的数组;这就是std::vector目的。如果你想要编译时大小的数组,你需要使用模板类型:

template<int count>
class FOO
{
public:
    FOO(initializer_list<Whatever> ilist)
    {
        // interate over x and y to give them their initial and permenent values
    }

private:
    const BAR x[count];
    const TAR y[count * 4];
};

#include "foo.h"
void main(void)
{
    // both need to work as expected
    FOO<30> alpha;
    FOO<44> * bravo = new FOO<44>;
}
于 2012-11-28T02:16:15.840 回答
0

除了 Nicol Bolas 使用模板参数使大小在编译时可配置的答案之外,您还可以在堆上分配内存:

class FOO
{
public:
    // this constructor needs to size x = count and y = count * 4
    FOO(int count) : x(new BAR[count]), y(new TAR[count])
    {
        // interate over x and y to give them their initial and permenent values
    }

    // Need a destructor to free the memory we allocated in the constructor
    ~FOO()
    {
        delete [] y;
        delete [] x;
    }
private:
    const BAR* x;
    const TAR* y;
};
于 2012-11-28T07:11:40.817 回答