包含对象的c ++结构

时间:2013-12-27 10:18:41

标签: c++ oop struct

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

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

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

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

这是一个好方法吗?

4 个答案:

答案 0 :(得分:8)

你的struct不包含一个对象,而是一个返回一个的函数:

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对象。

答案 1 :(得分:1)

首先,您的代码段无效,因为您没有为结构实例分配内存。 你也做不到这一点。您应该在结构中定义一个构造函数,它将在mem-initializer列表中调用obj的构造函数,前提是obj没有默认构造函数。

某事

struct Mystruct{

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

答案 2 :(得分:0)

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

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

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

然后像这样初始化它:

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

答案 3 :(得分:0)

凯撒说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;
 }