1

我不确定如何提出这个问题,所以我将从一些示例代码开始:

//header file
class A
{
public:
    A();
private:
    int x;
    std::string arr[x];
}

//cpp file

class A
{
public:
    A()
    {
     /*code to get the value of x from a cmd call*/
    }
}

此代码有效吗?更具体地说,我可以让我的头文件中的字符串数组的大小为 x,即使在创建 A 对象之前没有专门给 x 赋值?

如果这不起作用,我唯一的选择是使用动态分配的数组吗?

4

5 回答 5

5

代码无效。您应该改用向量。

class A
{
public:
    A();
private:
    int x;
    std::vector<std::string> arr;
};

A::A () : x(command_gets_x()), arr(x) {}

由于arr正在由 的值初始化x,因此构造函数仅在 in 之前起作用(x就像在您的定义中一样)。但是,如果 的唯一目的是跟踪数组的大小,则没有必要,因为 a具有该方法。arrAxvectorsize()

class A
{
public:
    A() : arr(command_gets_x()) {}
    int x () const { return arr.size(); }
    //...
private:
    std::vector<std::string> arr;
};
于 2012-07-31T23:12:13.720 回答
3

这是无效的。数组大小必须是常量表达式。是的,您必须使用动态分配,但不一定直接使用。您可以只使用 std::vector。

于 2012-07-31T23:12:45.410 回答
2

不,这是不可能的,因为 C++ 没有可变长度数组,而且数组大小必须是编译时间常数。

您可以在构造函数中使用 分配一个数组new,或者更好地使用 a std::vector

于 2012-07-31T23:12:36.237 回答
1

不,您不能使用非常量表达式初始化数组。这将起作用,并且接近您的初衷:

class A
{
   ...
   const int x = 3;
   std::string arr[x];
};

在 .cpp 文件中:

int A::x;
于 2012-07-31T23:14:57.710 回答
0

我发现在我的 Mac 上,在 x-code 中我可以执行以下操作

int x = foo() // get some value for x at runtime
int array[ x ];

但这太不酷了!!我昨天刚读到一些编译器允许在堆栈上进行动态分配,但我建议您远离这一点。

如果直到运行时才知道 x 的值,那么直到运行时才能分配大小为 x 的数组。想想编译器做了什么:如果我们不知道 x 有多大,可以分配一个大小为 x 的数组吗?唯一剩下的选择是在运行时分配(也就是动态分配)。

于 2012-07-31T23:54:58.693 回答