我已阅读有关解决方案const A a[3] = { {0,0}, {1,1}, {2,2} },
但在我的计划中const
无法使用:
class Paper: public PaperQueue{
...
protected:
typedef int (Utils::*funcPtr) (int, int); //I use external function there
funcPtr p;
Utils* fptr;
public:
int pricefunc(){
addprice = (fptr->*p) (t,price);
}
Paper(int n, unsigned int pr):PaperQueue(n){
...
p=&Utils::commonpricefunc;
}
void Put(int a){
...
}
...
}
class Bank{
...
void Buy(Paper &p){
(/*this function modifies many parameters in 'p'*/)
...
}
...
}
int main(){
Bank B;
int pn=5;
/* ? */ const Paper p[pn] = {{5,15},{5,15},{5,15},{5,15},{5,15}}; /* ? */
int paperloop=0;
...
p[paperloop].Put(p[paperloop].addprice);
B.Buy(p[paperloop]);
...
这给了我很多错误(使用pricefunc(),Put(),Buy(),...),或者只是“可变大小的对象'p'可能无法初始化”。有没有办法让这个数组工作? (如果不将任何参数传递给构造函数,一切正常!)
答案 0 :(得分:3)
您不能对类(非POD)使用初始化程序列表,因为这会绕过对构造函数的调用。您必须通过以下方式将其更改为POD或使用std :: vector:
如果类是可复制的,那么你可以创建一个std :: vector并用你想要的值填充它:
const vector<Paper> papers(5, Paper(5, 15));
如果要使用不同的值初始化它,可以使用初始化列表,但这仅在C ++ 11中支持:
const vector<Paper> papers = {Paper(1, 1), Paper(2, 2)};
如果没有C ++ 11,你必须逐个添加元素,但是你不能使向量为const:
vector<Paper> papers;
papers.push_back(Paper(1, 1));
papers.push_back(Paper(2, 2));
答案 1 :(得分:0)
请检查下面的代码,可以编译:
class Paper {
public:
int x, y;
};
int main() {
Paper p[5] = {{5,15}, {5,15}, {5,15}, {5,15}, {5,15}};
}
请参阅this post了解更多详情,我认为它解释得非常好