Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对象内的数组_C++_Arrays_Object - Fatal编程技术网

C++ 对象内的数组

C++ 对象内的数组,c++,arrays,object,C++,Arrays,Object,如果在arr之前定义了大小,则可以创建这样的数组 const int size = 5; int arr[size]; 但如果大小和arr位于对象或结构内部,则不可能: struct A{ A(int s) : size(s) {} const int size; int arr[size] }; A(5); 为什么会这样?这似乎有点不合逻辑,因为在这两种情况下,数组的大小在编译时是已知的。如果在编译时之前不知道,则需要从堆中动态分配内存 int*arr=

如果在arr之前定义了大小,则可以创建这样的数组

const int size = 5;
int arr[size];
但如果大小和arr位于对象或结构内部,则不可能:

struct A{
    A(int s) : size(s) 
    {}
    const int size;
    int arr[size]
};

A(5);

为什么会这样?这似乎有点不合逻辑,因为在这两种情况下,数组的大小在编译时是已知的。

如果在编译时之前不知道,则需要从堆中动态分配内存

int*arr=新的int[size]

如果不再需要内存,则应删除阵列

删除[]arr

正如Tony所说,最好使用standart图书馆向量

在这两种情况下,数组的大小在编译时是已知的

不,可以在运行时设置
const
类成员

事实上,即使是非成员也不总是有效的:

int x;
cin >> x;
const int y = x;
int z[y];   //ILLEGAL
只需使用一个按钮

这似乎有点不合逻辑,因为在这两种情况下,数组的大小在编译时是已知的

编译器无法区分您的示例和以下内容:

int i = std::rand(); // not a compile time constant
A a(i);
另一方面,它需要在编译时知道数组的大小。
A
的两个实例的大小不能不同。因此,数组的大小不能依赖于运行时可以设置的内容


另一方面,C++11提供了,它允许您通过表达式传播编译时常量,并允许您使用这些来初始化数组。

当编译器编译时,实际上不能保证它是编译时参数。正好是一个。我也可以这样做

int main() {
    std::cin >> i;
    A(i);
}

如果要向其传递constexpr参数,则需要使用模板。否则,您需要使用运行时容器,如std::vector。

如果您想要动态调整大小的数组,您应该使用
std::vector
而不是原始数组


您不能在代码> >类<代码>或<代码>结构> /COD>内执行您的操作,因为您的代码>大小< /代码>成员没有定义值。

因为在C++中,当初始化具有大小参数的C样式数组时,大小必须是编译时积分常数。

否则,编译器在编译时不知道变量的大小


如果您不喜欢这样,那么无论如何都应该使用
vector

在第二种情况下,如果您只考虑编译时不知道类定义数组大小的话

如果允许创建这样的类,您可以编写

A(5);
A(6);
这将是不同大小的对象,这将破坏很多,例如,不可能将这些对象保持在同一个数组中。说这些对象具有不同的类型是合乎逻辑的,如果您将类模板和传递大小作为模板参数,这是可能的


如果要使用不同大小的数组,请使用std::vector或templates。

在类/结构中不可能,因为
size
未初始化为值,这意味着您的数组可以有任何大小,这是无效的。改为使用
std::vector
。我知道vector或template,我只是想知道,为什么在编译时知道(如果)大小就不可能。所以,编译器无法检测函数参数编译时间是否为常量?还是只有使用constexpr和c++11才能实现?那么,我的例子在构造函数中使用constexpr合法吗?是的。但如果在编译时已知,那么对于一个简单数组也是可能的。@Amomum是的,但在这些情况下不是。问题是,为什么如果常量在编译时已知,那么对于结构内部的数组是不可能的,但在“外部”是可能的?@Amomum是的,但在您的情况下,常量在编译时是未知的。如果它是“5”,怎么可能在编译时不知道呢?再说一遍,为什么编译器可以对一个简单数组区分“int i;int arr[i]”和“const int i=2;int arr[i]”,但对结构内部的数组却不能做到这一点?我没有说“总是知道”,只是在这两种情况下。@Amome OK,我改变了措辞。底线是,在c++11之前,您被卡住了,使用c++11您可以使用
constexpr
。我看不出有什么区别。如果我不能用变量初始化常量,为什么结构中的常量应该不同?@amomem你可以用变量初始化常量。但是,当您声明一个类时,需要在声明时知道其大小或数组。size变量只在实例化时设置。但是如果我用变量初始化一个常量,我不能使用这个常量作为数组大小。若常数是编译时间常数,那个么我可以。关键是,如果数组在struct内部,我不能在两种情况下都这样做-这是不合逻辑的部分。有什么区别?