首页 > 解决方案 > C++ :: 如何创建具有多重继承的类的构造函数?

问题描述

我正在尝试在将调用超类构造函数的子类中创建一个构造函数。这是代码。

我已经声明了三个这样的类:

class Sub1 {
    private:
    std::vector<MainClass> subvar_1;

    public:
    Sub1(int);
};

Sub1::Sub1(int size) : subvar_1(size) { }
_____________________________________

class Sub2 {
    private:
    std::vector<MainClass> subvar_2;

    public:
    Sub2(int);
};

Sub2::Sub2(int size) : subvar_2(size) { }
_____________________________________

class Sub3 {
    private:
    std::vector<std::vector<MainClass>> subvar_3;

    public:
    Sub3(std::vector<int>&);
};

Sub3::Sub3(std::vector<int>& size) {
    subvar_3.reserve(size.size());
    for (const int clmns : size)
        subvar_3.emplace_back(std::vector<MainClass>(clmns));
}

MainClass 使用以下内容定义:

 class MainClass {
     private:
     int row;
     int cln;

     public:
     MainClass();
 };

 MainClass::MainClass() {
     row = rand();
     cln = rand();
 }

在声明了所有这些之后,我需要将它们全部放在一个大师班中,具有讽刺意味的是,这恰恰相反:

class MasterClass : public Sub1, Sub2, Sub3 {
    public:
    MasterClass(int, int, std::vector<int>&);
};

这会产生错误。该错误涉及:无法找到 Sub1()、Sub2() 和 Sub3() 构造函数。当然没有,它们不是有意的。我运行时会产生此错误:

MasterClass::MasterClass(int a, int b, std::vector<int>& c) :
    Sub1(a), Sub2(b), Sub3(c) { }

命令。

我正在使用以下代码编译代码:

g++ MainClass.cpp Sub1.cpp Sub2.cpp Sub3.cpp MasterClass.cpp

命令。

你能帮我为什么吗?我怎样才能绕过这个错误?

我想做的是:

MainClass::MainClass (int a, int b, std::vector<int>& c) {
    call constructor Sub1(a);
    call constructor Sub2(b);
    call constructor Sub3(c);
}

我相信我需要的 MasterClass:

private:
Sub1 sub1;
Sub2 sub2;
Sub3 sub3;

我将在哪里分配扩展我试图调用构造函数的类的对象的构造结果?

在 C++ 中甚至可以做到这一点(使用将调用超类构造函数的类构造函数)?

如果没有,有没有办法解决这个问题,但保持相同的结构?

标签: c++multiple-inheritance

解决方案


尝试这个:

MainClass::MainClass (int a, int b, std::vector<int>& c)
  : Sub1(a), Sub2(b), Sub3(c) {
}

但在此之前澄清问题。您MainClass在 SubX 类中进行了聚合。您打算如何将班级聚合成自身?你的意思是你需要从基类中引用这个类吗?

一种可能的解决方案是:

class Sub1;
class Sub2;
class Sub3;
class MainClass;

class Sub1 {
private:
    std::vector<std::shared_ptr<MainClass>> subvar_1;

public:
    Sub1(int);
};
// ...

问题是std::vector它的实例化需要一个完整的类型。您可以将它包装成不需要的东西,例如 shared_ptr,但您需要解决这个先有鸡还是先有蛋的问题:

class Sub1;
class Sub2;
class Sub3;
class MainClass;

class Sub1 {
private:
    std::shared_ptr<std::vector<MainClass>> subvar_1;

public:
    Sub1(int);
};
// ...

PS 最初我试图将它包装到 std::unique_ptr 中,但出于同样的原因,即使这样也不起作用。


推荐阅读