【发布时间】:2021-12-17 07:30:07
【问题描述】:
我创建了以下测试程序来演示我似乎无法解决的错误。我搜索并阅读了几篇文章,但没有一篇文章解释了如何解决这个特定问题。
我创建了一个具有多个构造函数的类,其中一个具有多个参数。我可以声明测试每个构造函数的类的实例,但是当我声明一个类数组时,我只能使用默认构造函数或带有单个参数的版本。
当我创建一个类数组并尝试使用多参数构造函数时,出现编译错误:“表达式列表在初始化程序 [-fpermissive] 中被视为复合表达式”。我正在使用 C++11 mingw 编译器,请参阅下面示例程序中的 kc5。
谁能解释一下错误的含义,以及当构造函数有多个参数时如何正确声明一个类对象数组?
#include <iostream>
using namespace std;
class KClass {
public:
int x=0;
KClass(){};//default constructor w/o parameters works
KClass(int a){//single parameter constructor works
x = a;
return;
}
KClass(char c,int a){//multi parameter constructor
x = a;
//not using char c for now
return;
}
~KClass(){};//destructor
int getx(){return x;}
void setx(int data){x=data;return;}
};
//class is declared, let's create some instances of the class
KClass kc0;//works
KClass kc1(5);//works
KClass kc2('k',7);//works
KClass kc3[2];//works
KClass kc4[2](4);//works
//next line does not compile (how do I fix?)
KClass kc5[2]('r',4);//compile error: expression list treated as compound expression in initializer
int main()
{
//do something
getchar();
return 0;
}
我了解到使用“new”关键字有效,但是,该解决方案对我来说似乎并不优雅,我不明白为什么需要“new”。
KClass *kc6 = new KClass[2]; //works
然后在 main() 中我使用多参数构造函数进行初始化。
kc6[0] = KClass('a',2);
kc6[1] = KClass('b',3);
【问题讨论】:
-
C++ 中没有办法做你想做的事。使用
std::vector代替数组。 -
你的代码是
KClass kc4[2](4);//works...真的吗?我怎么看不出来! Clang-cl 给出:error : array initializer must be an initializer list。但在使用 C++20 标准时,它似乎在 MSVC 中工作。 -
是的,KClass[2](4);使用 C++11 工作(基于我的测试)
标签: c++ class constructor initialization