以下是我正在尝试做的简化版
class Firstclass
{
public:
Firstclass(int x)
{
//do things with x;
}
};
class Secondclass
{
public:
Secondclass()
{
Firstclass a(10);
}
void func()
{
//Do things with a
}
private:
Firstclass a;
};
所以我有一个类(Firstclass),带有一个带有int参数的构造函数。现在我想在另一个类(Secondclass)的构造函数中创建该类的实例。
行
private:
Firstclass a;
如果我只是变量而不是类,我会做什么:首先提到它,以便我可以在别处使用它(例如在函数func()中)。 这似乎不适用于类,因为编译器不理解Secondclass的构造函数应该做什么。
我该如何正确地做到这一点?
答案 0 :(得分:6)
通过成员初始化列表
初始化它Secondclass() : a(10) { }
这是必需的,因为Firstclass
没有默认构造函数。此外,使用函数声明对带参数的类内初始化进行模糊处理,因此您可以在类体中执行此操作。在C ++ 11中,使用聚合初始化解决了这个问题:
Firstclass a{10};
答案 1 :(得分:2)
FirstClass
没有默认构造函数,因此您需要使用Secondclass
'构造函数初始化列表:
Secondclass() : a(10) {}
C ++ 11允许您在声明时初始化非静态数据成员,因此您也可以这样做:
class Firstclass
{
....
private:
Firstclass a{10};
};
你在这做什么:
Secondclass()
{
Firstclass a(10);
}
有两个错误:1)如上所述,FirstClass
没有默认构造函数,并且在初始化列表中没有初始化a
,你正在调用它的默认构造函数。 2)您声明了a
类型的局部变量Firstclass
,它只存在于构造函数体的范围内。这与您的数据成员a
不一样。
答案 2 :(得分:2)
正确地做到这一点的方法是使用构造函数初始化列表:
Secondclass) : a(10)
{
// ...
}
初始化列表还允许您指定为作为类字段的对象调用哪个构造函数。
因此,不是尝试使用不存在的默认构造函数初始化Secondclass
的成员a
,而是使用构造函数初始化列表指定要调用的构造函数。
自C ++ 11以来,有一种新的方法可以做到这一点。它被称为aggregate-initialization。语法是:
T object {arg1, arg2, ...};
在这种情况下,a
是一个类的非静态成员,因此它将是copy-initialized。
以下是复制初始化在这种特殊情况下的作用:
检查
Firstclass
的构造函数,并通过重载决策选择最佳匹配。然后调用构造函数来初始化对象。
因此,如果您想使用C ++ 11,那么您的类应该如下所示:
class Secondclass
{
public:
Secondclass()
{
}
void func()
{
//Do things with a
}
private:
Firstclass a{10};
};
指出另一个错误:
Secondclass()
{
Firstclass a(10);
}
你没有按照你的想法行事。在这里,您声明一个类型为a
的变量Firstclass
,它只存在于构造函数范围内,它将在范围的末尾被破坏。它与a
成员不同。