C ++初始化使用" new"分配的结构的对象成员。关键词

时间:2015-02-13 23:58:23

标签: c++ struct initialization

这可能是一个复杂的问题,但我认为它有一个简单的答案。

所以我有一个包含自定义对象类型的结构:

// header1.h

struct MyStruct
{
    MyClass myObject1;
    MyClass myObject2;
};

我有一个指向MyStruct的全局指针。我将使用new关键字分配和实例化结构。当我这样做时,我想在初始化列表中按名称构造每个myObject,如下所示。

// codeFile1.cpp

MyStruct *myStructPtr;

int main()
{
    myStructPtr = new MyStruct
    {                                     //syntax error: missing ';'
        .myObject1 = MyClass(arg1, arg2),
        .myObject2 = MyClass(arg1, arg2)
    };
}

上面的代码段有语法错误,但它演示了我想要做的事情。请注意,MyClass没有默认构造函数,因此必须给它一个参数列表。

谢谢!

编辑 - 结论

正如所指出的,我的初始化列表是C风格,但无法正常工作。不幸的是,C ++ 11初始化列表不符合我的编译器要求,并且将所有参数抛出到构造函数中的选项是不切实际的。

所以我采用了另一种解决方案并将指针结构更改为以下内容:

// header1.h

struct MyStruct
{
    MyClass *myObjectPtr1;
    MyClass *myObjectPtr2;
};

// codeFile1.cpp

MyStruct myStruct;

int main()
{
    myStructPtr.myObjectPtr1 = new MyClass(arg1, arg2);
    myStructPtr.myObjectPtr2 = new MyClass(arg1, arg2);
}

全部谢谢!

3 个答案:

答案 0 :(得分:3)

如果MyStruct是聚合,您可以使用aggregate initialization来避免定义构造函数:

myStructPtr = new MyStruct {{arg1, arg2}, {arg1, arg2}};

如果没有,请提供一个构造函数,并使用适当的参数并调用

myStructPtr = new MyStruct{arg1, arg2};

答案 1 :(得分:2)

您正在尝试使用C&C指定的初始值设定项are not part of C++。如果您有C ++ 11编译器,则只需执行以下操作:

MyStruct *myStructPtr = new MyStruct
{
    MyClass(arg1, arg2),
    MyClass(arg1, arg2)
};

Live demo

答案 2 :(得分:1)

你会以某种方式将你的结构链接在一起。假设你真的想要相同的参数:

struct MyStruct
{
    MyStruct(int arg1, int arg2) : myObject(arg1, arg2), myObejct2(arg1, arg2) {}
    MyClass myObject1;
    MyClass myObject2;
};

MyStruct *s = new MyStruct(34, 42);

或类似的东西:

struct MyStruct
{
    MyStruct(const MyClass& a1, const MyClass& a2) : myObject(a1), myObejct2(a2) {}
 .... 
};

MyStruct *s = new MyStruct(MyClass(1,2), MyClass(3,4));

或在C ++ 11初始化列表中:

MyStruct *s = new MyStruct({1,2}, {3,4});

还有许多其他类似的解决方案。