在另一个类中使用类的实例

时间:2013-08-10 17:06:11

标签: c++

以下是我正在尝试做的简化版

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的构造函数应该做什么。

我该如何正确地做到这一点?

3 个答案:

答案 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成员不同。