我试图实例化一个类的数组,其中构造函数接受两个参数,并在同一行中对其进行初始化。
从概念上讲,我想做这样的事情:
foo::foo (int A, int B = 10)
{
V1 = A;
V2 = B;
}
foo Myfoo[3] = { (1, 100), (2, 300), (5, 100) };
// what I _don't_ want to do is create individual objects like this:
// foo Myfoo1(1, 100);
// foo Myfoo2(2, 300);
// foo Myfoo3(5, 100);
我发现的是,在调用构造函数时,参数不符合预期。 B参数始终显示为默认值10。只是在进行修补时,我在数组初始化中添加了其他参数。
foo Myfoo[3] = { (0, 1, 100), (2, 300, 0), (0, 5, 100, 0) };
令我惊讶的是,它编译时没有错误,但是我并没有做太多,因为它对我来说没有意义-但我能够影响到这个问题
有人对我应该如何编写代码有想法吗?我已经解决了这个问题,但是很好奇应该如何正确解决。
答案 0 :(得分:3)
使用(1, 100)
时,您只是将一个值为int
的{{1}}传递给100
的构造函数。 comma-operator仅丢弃第一个操作数,并在此处返回第二个操作数。 (它无法像您期望的那样像foo
或foo Myfoo1(1, 100);
那样工作。)
您应该使用foo(1, 100);
(list initialization (since C++11))代替{}
,即
()
答案 1 :(得分:2)
问题has already been explaind by @songhuanyao的原因。
我可以想到以下解决问题的方法。
使用{}
代替()
来构造对象。
foo Myfoo[3] = { {1, 100}, {2, 300}, {5, 100}};
将foo
与()
一起使用以构造对象。
foo Myfoo[3] = { foo(1, 100), foo(2, 300), foo(5, 100) };
将foo
与{}
一起使用以构造对象。
foo Myfoo[3] = { foo{1, 100}, foo{2, 300}, foo{5, 100}};
答案 2 :(得分:1)
我们需要使用{}
而不是()
,并且代码可以正常工作
#include<iostream>
using namespace std;
class Test
{
public:
Test(int a, int b = 10)
{
x = a;
y = b;
cout << "C-tor" << endl;
}
void show()
{
cout << " x = " << x << " y = " << y << endl;
}
private:
int x;
int y;
};
int main()
{
Test obj[3] = {{10,20},{30,40}, {50,60}};
obj[0].show();
obj[1].show();
obj[2].show();
return 0;
}
上面的代码产生预期的输出:
C-tor
C-tor
C-tor
x = 10 y = 20
x = 30 y = 40
x = 50 y = 60
希望对您有帮助!