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);
}