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

C++ 在构造函数中创建带有参数的类数组,c++,arrays,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::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) }; 
令我惊讶的是,它编译时没有出错,但我没有走得太远,因为它对我来说没有意义——但我能够影响问题

有人知道我应该如何编写代码吗?我已经解决了这个问题,但我很好奇应该如何正确地处理它。

使用
(1100)
,您只需将一个
int
100
传递给
foo
的构造函数。只需丢弃第一个操作数,并在此处返回第二个操作数。(它不像您期望的那样工作,比如
foomyfoo1(1100);
foo(1100);

您应该使用
{}
()而不是
()
,即

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

我们需要使用
{}
而不是
()
,并且代码按预期工作

#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;
 }
#包括
使用名称空间std;
课堂测试
{
公众:
测试(int a,int b=10)
{
x=a;
y=b;
无法找到问题的原因

我可以想出以下方法来解决这个问题

选择1 使用
{}
而不是
()
来构造对象

foo Myfoo[3] = { {1, 100}, {2, 300}, {5, 100}};
foo Myfoo[3] = { foo(1, 100), foo(2, 300), foo(5, 100) };
foo Myfoo[3] = { foo{1, 100}, foo{2, 300}, foo{5, 100}};
选择2 使用
foo
()
来构造对象

foo Myfoo[3] = { {1, 100}, {2, 300}, {5, 100}};
foo Myfoo[3] = { foo(1, 100), foo(2, 300), foo(5, 100) };
foo Myfoo[3] = { foo{1, 100}, foo{2, 300}, foo{5, 100}};
选择3 使用
foo
{}
来构造对象

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

我使用MS Visual Studio 2010尝试了此操作,但它不会编译,并给出错误消息:1>d:\dev\arraytest\arraytest\arraytest.cpp(24):错误C2552:“Myfoo”:无法使用初始值设定项列表1>“foo”初始化非聚合:不支持使用用户定义构造函数的类型aggregate@ElRonaldo您的编译器支持C++11吗?或者它可能在列表初始化方面遇到一些问题。我创建了一个实时演示。您的选项2对我有效!但这不会创建一个额外的foo吗每次?我想知道这是否是您真正需要定义副本构造函数的情况之一(但我不确定我是否使用了正确的术语)@El罗纳尔多,理论上,无论你选择哪个选项,都有一个副本。我不确定编译器是否能够省略这些复制操作。谢谢你的回答Sinha!我将你的示例复制到Visual Studio 2010中,但它不会编译-得到与宋元耀相同的错误消息。你使用了什么编译器?谢谢@ElRonaldo我在Ubuntu 18.04LTSgcc 7.3.0版(Ubuntu 7.3.0-27ubuntu1~18.04)上使用g++在这个版本上编译代码。