是否可以在 C++ 中的超类中拥有子类的成员
Posted
技术标签:
【中文标题】是否可以在 C++ 中的超类中拥有子类的成员【英文标题】:is it possible to have a members of subclasses in superclass in c++ 【发布时间】:2020-11-03 20:36:18 【问题描述】:我的目标是,我不想将所有方法都放在 ServerInterface(superclass) 中,而是将方法放在子类中以更好地组织代码。
class ServerInterface
public:
Router* router = new Router();
Client* client = new Client();
ServerInterface()
//Creates new Router and Client instance
;
class Router : public ServerInterface
public:
Router()
void randomRouterFunction()
;
class Client : public ServerInterface
public:
Client()
virtual void randomClientFunction() ;
;
class ProductionServer : public ServerInterface
public:
ProductionServer()
;
int main()
ProductionServer* productionServer = new ProductionServer();
productionServer->router->randomRouterFunction(); //causes it to not debug
return 0;
在我的情况下,我只被允许访问ProductionServer
,它必须从我的代码中的ServerInterface
继承。
因此,我不想打电话给productionServer->randomRouterFunction()
或productionServer->randomClientFunction()
,而是希望能够打电话给productionServer->Router->randomRouterFunction()
等
尽管智能感知告诉我一切正常,但尝试运行我收到的代码
main:289:20: 错误:'class ProductionServer' 没有名为的成员 '路由器'
productionServer->router->randomRouterFunction();
这是否可行?认为它可能不起作用的原因是因为超类创建了Router的一个成员,它是子类,然后路由器子类创建了另一个超类,因为它继承了它,然后在超类中创建了另一个路由器子类...... .这将是一个无限循环?呵呵
ps。 randomFunction() 可以是任何方法,仅用作示例。
【问题讨论】:
我们实际上看不到损坏的代码,CoffeDev... 出示您的minimal reproducible example。 这是否回答了您的问题:Resolve build errors due to circular dependency amongst classes ? " 超类创建了Router 的一个成员,它是子类" 它没有;你有一个Router*
,而不是Router
。
@πάνταῥεῖ 不,这更像是class ProductionServer undeclared
.... 无论如何,这里没有多个标题的证据,更不用说循环依赖了。咱们别操之过急,嗯?
@AsteroidsWithWings 哦抱歉错过了,将编辑:D
【参考方案1】:
问题在于设计。您可以编译它,但是当您创建 ProductionServer
时,它将实例化一个 ServerInterface
,这将创建一个 Router
和一个 Client
,它们还将实例化一个 ServerInterface
,这将创建一个 Router
和一个Client
等等 - 直到你得到堆栈溢出。
为了在某些工作条件下获得它,您需要添加一些东西来打破这个循环,这样它就不会无休止地实例化 Router
s 和 Client
s。
【讨论】:
哦,这就是我所害怕的 :( 有没有其他方法可以以类似的方式进行分组,而不必将所有方法都放在 ServerInterface 中? @CoffeDev 总有一些选择,但使用一些现实世界的功能会更容易提供建议。一种选择是CRTP,但你会失去其他一些优势。 我可以顺便确认一下,它没有编译的原因就是你提到的确切原因!我让它工作的方法是将 ServerInterface 命名为 SuperServerInterface,并有一个名为 ServerInterface 的子类,它创建了路由器和客户端,所以没有无限循环,瞧它工作了。感谢您的帮助! @CoffeDev 不客气,但实际上我确实成功编译了它(添加了Router
和Client
的前向声明)。由于堆栈溢出,它在运行时失败。我可能已经抓住了您对代码的早期编辑之一。我把原始指针变成了像this 这样的智能指针,发现它退出很糟糕,并发现了无休止的创建周期。
@CoffeDev 为什么ServerInterface
有Client
?通常服务器和客户端是两个完全独立的东西。我认为你需要继续思考如何在你的类中分离事物,同样重要的是这些类是如何相关的。另外,我强烈建议找一个比SuperServerInterface
更好的名字。名称应该描述它们的用途,前缀“Super”对这个接口的用途没有任何意义。以上是关于是否可以在 C++ 中的超类中拥有子类的成员的主要内容,如果未能解决你的问题,请参考以下文章
子类是不是也继承了 C++ 中的私有数据成员?但是是通过超类的公共方法访问的吗?
`attemptRecovery(fromError:optionIndex:)` 在 NSDocument 的 Swift 子类的超类中找不到