C++继承场景下基类内实例化派生类成员报错如何解决
你代码存在的核心问题
- 循环依赖+类定义顺序错误:你定义
MainClass时用到了SubClass类型的成员变量,此时SubClass还没有被完整定义;同时你让SubClass继承自MainClass,会造成逻辑上的无限嵌套(父类包含子类对象,子类对象又包含父类基础部分,编译器无法计算类的内存大小,直接编译失败)。 - 构造函数语法错误:类的构造函数没有返回值,你给
MainClass的构造函数加了string返回类型,不符合语法规范。 - 未定义变量引用:
SubClass的两个方法里返回的变量a,在整个代码中没有声明定义,会编译报错。 - 主函数语法错误:C++的入口函数是小写的
main,你写的大写Main不符合规范。 - 缺少必要头文件:用到
string类型需要包含<string>头文件。
修正方案
你的需求只是在MainClass实例中可以调用内部SubClass成员的方法,完全不需要让SubClass继承MainClass,调整类定义顺序、修正语法错误即可,修正后代码如下:
#include <string> using namespace std; // 先完整定义SubClass class SubClass { public: string a = "测试返回值"; // 补充你用到的a变量的定义 string Method_1() { return a; } string Method_2() { return a; } }; // 再定义MainClass class MainClass { string _ClassName; public: // 去掉构造函数的返回值 MainClass(string _C) { _ClassName = _C; } SubClass s1; // 此时SubClass已经完整定义,可以声明普通成员变量 }; int main() { MainClass M1("test"); M1.s1.Method_1(); // 可以正常调用 return 0; }
如果确实有业务要求SubClass必须继承MainClass,则需要把MainClass里的s1改为指针类型,配合前向声明解决循环依赖,参考实现如下:
#include <string> #include <memory> using namespace std; // 前向声明SubClass class SubClass; class MainClass { string _ClassName; public: MainClass(string _C); // 用智能指针,不需要完整类定义即可声明 unique_ptr<SubClass> s1; }; // 等MainClass定义完成后再定义SubClass继承 class SubClass : public MainClass { public: string a = "测试返回值"; SubClass(string _C) : MainClass(_C) {} string Method_1() { return a; } string Method_2() { return a; } }; // MainClass构造函数放到SubClass定义之后实现,完成s1的初始化 MainClass::MainClass(string _C) : _ClassName(_C), s1(make_unique<SubClass>(_C)) {} int main() { MainClass M1("test"); M1.s1->Method_1(); // 正常调用 return 0; }
内容的提问来源于stack exchange,提问作者user14201328
相关产品推荐
相关产品推荐

