c++ - 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++ 中甚至可以做到这一点(使用将调用超类构造函数的类构造函数)?
如果没有,有没有办法解决这个问题,但保持相同的结构?
解决方案
尝试这个:
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 中,但出于同样的原因,即使这样也不起作用。
推荐阅读
- .net-core - 为 .NET Core Worker 服务设置环境名称(生产、开发等)
- javascript - 在 JavaScript 中解析嵌套的 Json 对象
- github - 用户分享主题的 Github URL
- reactjs - 我想使用我的表单输入来设置起点和终点
- c# - 将数据从 MySql 加载到数据网格表时,Visual Studio 中缺少 Cast 错误
- javascript - 如何在 Mysql 中将 Javascript 对象格式化为多边形
- azure-data-explorer - kusto 查询以在对其他两列使用 distinct 后显示第三列
- scala - Spark Scala SQL:取非空列的平均值
- multithreading - 使用 Threads.@threads 的意外行为?
- ansible - 我的 yaml 脚本在 raspberrypi 中不起作用