是否可以在 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 等等 - 直到你得到堆栈溢出。

为了在某些工作条件下获得它,您需要添加一些东西来打破这个循环,这样它就不会无休止地实例化 Routers 和 Clients。

【讨论】:

哦,这就是我所害怕的 :( 有没有其他方法可以以类似的方式进行分组,而不必将所有方法都放在 ServerInterface 中? @CoffeDev 总有一些选择,但使用一些现实世界的功能会更容易提供建议。一种选择是CRTP,但你会失去其他一些优势。 我可以顺便确认一下,它没有编译的原因就是你提到的确切原因!我让它工作的方法是将 ServerInterface 命名为 SuperServerInterface,并有一个名为 ServerInterface 的子类,它创建了路由器和客户端,所以没有无限循环,瞧它工作了。感谢您的帮助! @CoffeDev 不客气,但实际上我确实成功编译了它(添加了RouterClient 的前向声明)。由于堆栈溢出,它在运行时失败。我可能已经抓住了您对代码的早期编辑之一。我把原始指针变成了像this 这样的智能指针,发现它退出很糟糕,并发现了无休止的创建周期。 @CoffeDev 为什么ServerInterfaceClient?通常服务器和客户端是两个完全独立的东西。我认为你需要继续思考如何在你的类中分离事物,同样重要的是这些类是如何相关的。另外,我强烈建议找一个比SuperServerInterface 更好的名字。名称应该描述它们的用途,前缀“Super”对这个接口的用途没有任何意义。

以上是关于是否可以在 C++ 中的超类中拥有子类的成员的主要内容,如果未能解决你的问题,请参考以下文章

通过首先将二维数组发送到 C++ 中的超类来初始化子类?

子类是不是也继承了 C++ 中的私有数据成员?但是是通过超类的公共方法访问的吗?

是否可以从属于子类元素的子类访问超类中的属性?

子类是不是从 Swift 中的超类扩展继承便利初始化程序?

`attemptRecovery(fromError:optionIndex:)` 在 NSDocument 的 Swift 子类的超类中找不到

访问子类中的超类变量/方法