包含对象的 C++ 结构

c++ structure containing object

本文关键字:结构 C++ 对象 包含      更新时间:2023-10-16

我想创建一个结构,比如说Mystruct,它包含一个整数和一个myObj对象,其构造函数需要2个参数(一个是字符串,另一个是int)。我的意思是我想要:

struct Mystruct{
   myObj obj();
   int a;
};

现在,经过一些操作,我想创建一个 Mystruct 变量和 initiliaze obj 和 a。为此,我写道:

struct Mystruct* foo;
foo->a=5;
foo->obj=myObj("test",3);

这是一个好方法吗?

您的结构不包含对象,而是一个返回对象的函数:

struct Mystruct{
   myObj obj();  // this is a function declaration
   int a;
};

听起来你的意思是

struct Mystruct{
   myObj obj;
   int a;
};

那你可以说

Mystruct foo; // default constructs obj: myObj must be default constructable
foo.a = 5;
foo.obj = myObj("test",3);

Mystruct foo = {myObj("test",3), 5};

请注意缺少指针和动态分配:只有在确实需要并且知道自己在做什么时,才应该使用它们。

为了完整起见,您对指针的尝试失败,因为当您声明此指针时:

struct Mystruct* foo;

没有指向任何有用的东西(实际上,它拥有一个内存地址,你可以认为它是随机的,并指向你不应该写的地方)。所以你不能这样做:

foo->a = 42; // Ooops, foo doesn't point to a MyStruct object yet.

以这种方式使用它之前,您需要foo指向MyStruct对象。

首先,您的代码片段无效,因为您没有为结构实例分配内存。你也不能那样做。您应该在结构中定义一个构造函数,该构造函数将在 mem 初始值设定项列表中调用 obj 的构造函数,前提是 obj 没有默认构造函数。

作为

struct Mystruct{
   Mystruct( syting s, int i ) : obj( s, i ) {}
   myObj obj;
   int a;
};

caesar 说 MyObj 有两个参数作为构造函数。因此,MyObj类似于下面的代码。

struct MyObj
{
        MyObj(string name, int number)
            : name_(name), number_(number) {}
        string  name_;
        int     number_;
};

然后,MyStruct 有一个 MyObj 作为成员变量,所以它必须有如下所示的用户定义构造函数,因为 MyObj 没有默认构造函数,所以 MyStruct 也不能有默认构造函数。

struct MyStruct{
    MyStruct(MyObj obj, int a)
       : my_obj_(obj), a_(a) {}
    MyObj my_obj_;
    int a_;
 };
 int main()
 {
     MyObj my_obj("tester", 1001);
     MyStruct my_struct(my_obj, 1);
     getchar();
     return 0;
 }

假设myObj没有默认构造函数(没有参数),您不能只创建未初始化myObjMystruct。正确的方法是通过Mystruct构造函数传递myObj值(或者更好的是对值的引用):

struct Mystruct{
    myObj obj;
    int a;
    Mystruct(int a, const myObj& obj) : a(a), obj(obj) {}
};

这里: a(a), obj(obj)所谓的初始化列表a(foo)表示在构造对象时foo初始化a Mystruct。在上面的示例中a Mystruct 的成员正在使用构造函数参数中的值进行初始化a。看起来有点奇怪,但要避免繁琐的参数名称,如_a等。

然后像这样初始化它:

Mystruct foo(5, myObj("test", 3));