C++父类无无参构造时子类无参构造编译报错如何解决?
报错原因
编译报错的核心是当前编译B类无参构造的位置,缺少VFSImpl、FSImplPtr两个类型的完整定义。你之前的有参构造可以正常运行,是因为你创建B实例的代码位置已经引入了这两个类型的头文件,但B类定义的位置并没有引入对应的定义。
另外注意你贴出的错误代码中,初始化列表写的是A(FSImplPtr(new VFSImpl())),和你原本设计的A(SomeFunction(new VFSImpl()))写法不一致,也要检查是否是手误写错了参数。
修复方案
方案一:直接引入头文件
在B类定义所在的头文件顶部,引入两个类型对应的头文件即可:
// 替换为实际的头文件路径 #include "VFSImpl.h" #include "FSImplPtr.h" #include "SomeFunction.h" // 如果你用了SomeFunction也要引入对应的头文件 class B : public A { public: B() : A(SomeFunction(new VFSImpl())) {}; B(FSImplPtr impl) : A(impl) {}; };
方案二:把构造实现移到cpp文件(推荐,避免头文件依赖泄露)
如果不想让B类的使用者感知到VFSImpl这类内部实现依赖,可以把无参构造的实现拆分到cpp文件里,头文件仅做声明:
头文件 B.h
class B : public A { public: B(); // 仅声明无参构造 B(FSImplPtr impl) : A(impl) {}; };
实现文件 B.cpp
#include "B.h" // 在cpp中引入依赖,不会暴露给头文件的使用者 #include "VFSImpl.h" #include "FSImplPtr.h" #include "SomeFunction.h" B::B() : A(SomeFunction(new VFSImpl())) {}
内容的提问来源于stack exchange,提问作者Alrott SlimRG
相关产品推荐
相关产品推荐

