C++ :: 如何创建具有多重继承的 class 的构造函数?

C++ :: how to make a constructor of a class that has multiple inheritance?

我正在尝试在 subclass 中创建一个构造函数,它将调用 superclass 构造函数。这是代码。

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

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

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

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;

我将在何处分配构建对象的结果,这些对象正在扩展 class 我试图调用构造函数的地方?

在 C++ 中是否有可能做到这一点(使用 class 构造函数调用 superclass 构造函数)?

如果不是,有什么方法可以解决这个问题,但要保持相同的结构?

试试这个:

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

不过在此之前把问题弄清楚。您在 SubX classes 中聚合了 MainClass。您打算如何将 class 聚合到自身?您的意思是您需要从基础 class 中引用此 class 吗?

一个可能的解决方案是:

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

P.S。最初我试图将它包装成 std::unique_ptr,但出于同样的原因,即使那样也没有用。