C++ 初始化使用 "new" 关键字分配的结构的对象成员
C++ Initialize object member of a struct that is allocated using the "new" keyword
这可能是一个复杂的问题,但我认为它有一个简单的答案。
所以我有一个包含自定义对象类型的结构:
// 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);
}
谢谢大家!
您正在尝试使用 C 的指定初始值设定项,are not part of C++。如果你有 C++11 编译器,你可以简单地执行以下操作:
MyStruct *myStructPtr = new MyStruct
{
MyClass(arg1, arg2),
MyClass(arg1, arg2)
};
如果 MyStruct
是聚合,您可以使用 aggregate initialization 来避免定义构造函数:
myStructPtr = new MyStruct {{arg1, arg2}, {arg1, arg2}};
如果没有,请提供一个采用适当参数的构造函数并调用
myStructPtr = new MyStruct{arg1, arg2};
不知何故,您将需要将您的构造链接在一起。假设您实际上想要相同的参数:
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});
还有许多其他类似的解决方案。
这可能是一个复杂的问题,但我认为它有一个简单的答案。
所以我有一个包含自定义对象类型的结构:
// 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);
}
谢谢大家!
您正在尝试使用 C 的指定初始值设定项,are not part of C++。如果你有 C++11 编译器,你可以简单地执行以下操作:
MyStruct *myStructPtr = new MyStruct
{
MyClass(arg1, arg2),
MyClass(arg1, arg2)
};
如果 MyStruct
是聚合,您可以使用 aggregate initialization 来避免定义构造函数:
myStructPtr = new MyStruct {{arg1, arg2}, {arg1, arg2}};
如果没有,请提供一个采用适当参数的构造函数并调用
myStructPtr = new MyStruct{arg1, arg2};
不知何故,您将需要将您的构造链接在一起。假设您实际上想要相同的参数:
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});
还有许多其他类似的解决方案。