如何正确存储/传递接口类型的变量(现代 c++)?

How to correctly store/pass a variable of interface type (modern c++)?

本文关键字:变量 现代 c++ 接口类型 存储 何正确      更新时间:2023-10-16

我有两个接口:INetworkIController。类App会将两个接口的实现存储为其字段。两个接口应该能够访问彼此的公共方法。它看起来像这样:

class INetwork
{
public:
virtual ~INetwork() {}
virtual void do_something() = 0;
virtual void setController(IController*);
}
class IController
{
public:
virtual ~IController() {}
virtual void do_something() = 0;
virtual void setNetwork(INetwork*);
}
class Controller : public IController
{
void do_something() override;
}
class Network : public INetwork
{
void do_something() override;
}
class App
{
private:
IController *controller;
INetwork *network;
void initialize()
{
controller = new Controller(); //todo: factory
network = new Network(); //todo: factory
controller.setNetwork(network);
network.setController(controller);
}
}

这个想法:

  • NetworkController是两个独立的实体,会随着时间的推移而发展(ControllerV1ControllerV2ControllerMultithreadedNetworkHttpNetworkModbus等(,但我仍然需要保持向后兼容性,具体的实现将取决于配置。这就是我使用接口的原因。
  • NetworkController将能够根据各种事件、状态变化等相互控制。这就是为什么我通过setController(IController*)setNetwork(INetwork*)将它们传递给彼此的原因。我还想为NetworkController实现观察者模式。

现在的主要问题是我不确定如何使用现代 C++11/14 方法正确实施我的所有想法。 我应该在App中存储INetworkIController一个简单的指针,还是应该在此处使用std::shared_ptr?如何在IController内存储和传递对INetwork的引用,反之亦然? 继承有问题吗?

C++提供了几种乐器,我在这里有点迷茫。

TL&DR

  1. 我应该使用原始指针还是切换到 std::shared_ptr 更好?
  2. 您如何看待继承计划?

您提出的问题没有唯一的正确答案。

存储/传递变量有不同的方法,这些变量是接口,您已经提到了其中的一些方法。处理此问题的其他一些方法取决于您最终要实现的目标。

例如,如果您最终关心的是具有多态行为,并且您不依赖于设计/类型细节,则还可以考虑使用类型擦除并按值存储/传递这些实体(从语义上讲(。至于你如何以及为什么想要这样做——这也解决了你关于使用继承的问题——我建议看肖恩·帕伦特的演讲:继承是邪恶的基础类。

至于你应该走哪条路,这是一个更适合代码审查或软件工程等网站的意见问题。