我想创建一个结构,让我们说Mystruct,它包含一个整数和一个myObj对象,其构造函数有两个参数(一个是字符串,另一个是int)。我的意思是我想:
struct Mystruct{
myObj obj();
int a;
};
现在,经过一些操作,我想创建一个Mystruct变量并初始化obj和a。为此,我写道:
struct Mystruct* foo;
foo->a=5;
foo->obj=myObj("test",3);
这是一个好方法吗?
答案 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;
}