C++ 在另一个类中使用一个类的实例
这是我试图做的一个简化版本C++ 在另一个类中使用一个类的实例,c++,C++,这是我试图做的一个简化版本 class Firstclass { public: Firstclass(int x) { //do things with x; } }; class Secondclass { public: Secondclass() { Firstclass a(10); } void func()
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;
如果a只是一个变量而不是一个类,我会怎么做:首先提及它,这样我就可以在其他地方使用它(例如在函数func()中)。
这似乎不适用于类,因为编译器不理解Secondclass的构造函数应该做什么
如何正确地执行此操作
FirstClass
没有默认构造函数,因此需要使用Secondclass
构造函数初始化列表:
Secondclass() : a(10) {}
C++11允许您在声明时初始化非静态数据成员,因此您也可以这样做:
class Firstclass
{
....
private:
Firstclass a{10};
};
你在这里做什么:
Secondclass()
{
Firstclass a(10);
}
在两个方面是错误的:1)正如我前面提到的,FirstClass
没有默认构造函数,并且通过在初始化列表中不初始化a
,您正在调用其默认构造函数。2) 您正在声明类型为Firstclass
的局部变量a
,该变量仅存在于构造函数主体的范围内。这与您的数据成员a
不同,通过成员初始值设定项列表对其进行初始化:
这是必需的,因为Firstclass
没有默认构造函数。另外,带有参数的类内初始化通过函数声明来实现,因此可以在类主体中实现。在C++11中,这通过聚合初始化解决:
正确执行此操作的一种方法是使用构造函数初始化列表:
Secondclass) : a(10)
{
// ...
}
初始化列表还允许您指定为类的字段对象调用哪个构造函数
因此,使用构造函数初始化列表指定要调用的构造函数,而不是尝试使用不存在的默认构造函数初始化Secondclass
的成员a
自从C++11以来,有了一种新的方法来实现这一点。它被称为。语法是:
T object {arg1, arg2, ...};
在本例中,a
是类的非静态成员,因此它将是
以下是在这种特殊情况下复制初始化的操作:
检查第一类
的构造函数,并通过重载解析选择最佳匹配。然后调用构造函数来初始化对象
因此,如果您想使用C++11,您的类应该如下所示:
class Secondclass
{
public:
Secondclass()
{
}
void func()
{
//Do things with a
}
private:
Firstclass a{10};
};
我只想指出另一个错误:
Secondclass()
{
Firstclass a(10);
}
你不是在做你想做的事。在这里,您将声明一个类型为
Firstclass
的变量a
,该变量将只存在于构造函数范围内,它将在范围的末尾被销毁。它与a
成员不同。您是否希望Firstclass
的实例在Secondclass
的构造函数完成后继续存在?之所以需要它,是因为Firstclass
没有默认构造函数。@juanchopanza ok已更改
class Secondclass
{
public:
Secondclass()
{
}
void func()
{
//Do things with a
}
private:
Firstclass a{10};
};
Secondclass()
{
Firstclass a(10);
}