在构造函数中创建带有参数的类的数组

时间:2019-07-03 03:24:46

标签: c++ arrays

我试图实例化一个类的数组,其中构造函数接受两个参数,并在同一行中对其进行初始化。

从概念上讲,我想做这样的事情:

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) }; 

令我惊讶的是,它编译时没有错误,但是我并没有做太多,因为它对我来说没有意义-但我能够影响到这个问题

有人对我应该如何编写代码有想法吗?我已经解决了这个问题,但是很好奇应该如何正确解决。

3 个答案:

答案 0 :(得分:3)

使用(1, 100)时,您只是将一个值为int的{​​{1}}传递给100的构造函数。 comma-operator仅丢弃第一个操作数,并在此处返回第二个操作数。 (它无法像您期望的那样像foofoo Myfoo1(1, 100);那样工作。)

您应该使用foo(1, 100);list initialization (since C++11))代替{},即

()

答案 1 :(得分:2)

问题has already been explaind by @songhuanyao的原因。

我可以想到以下解决问题的方法。

选项1

使用{}代替()来构造对象。

foo Myfoo[3] = { {1, 100}, {2, 300}, {5, 100}};

选项2

foo()一起使用以构造对象。

foo Myfoo[3] = { foo(1, 100), foo(2, 300), foo(5, 100) };

选项3

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

希望对您有帮助!