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,但出于同样的原因,即使那样也没有用。
我正在尝试在 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,但出于同样的原因,即使那样也没有用。