如何正确存储/传递接口类型的变量(现代 c++)?
How to correctly store/pass a variable of interface type (modern c++)?
我有两个接口:INetwork
和IController
。类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);
}
}
这个想法:
Network
和Controller
是两个独立的实体,会随着时间的推移而发展(ControllerV1
、ControllerV2
、ControllerMultithreaded
、NetworkHttp
、NetworkModbus
等(,但我仍然需要保持向后兼容性,具体的实现将取决于配置。这就是我使用接口的原因。Network
和Controller
将能够根据各种事件、状态变化等相互控制。这就是为什么我通过setController(IController*)
和setNetwork(INetwork*)
将它们传递给彼此的原因。我还想为Network
和Controller
实现观察者模式。
现在的主要问题是我不确定如何使用现代 C++11/14 方法正确实施我的所有想法。 我应该在App
中存储INetwork
并IController
一个简单的指针,还是应该在此处使用std::shared_ptr
?如何在IController
内存储和传递对INetwork
的引用,反之亦然? 继承有问题吗?
C++提供了几种乐器,我在这里有点迷茫。
TL&DR
- 我应该使用原始指针还是切换到 std::shared_ptr 更好?
- 您如何看待继承计划?
您提出的问题没有唯一的正确答案。
存储/传递变量有不同的方法,这些变量是接口,您已经提到了其中的一些方法。处理此问题的其他一些方法取决于您最终要实现的目标。
例如,如果您最终关心的是具有多态行为,并且您不依赖于设计/类型细节,则还可以考虑使用类型擦除并按值存储/传递这些实体(从语义上讲(。至于你如何以及为什么想要这样做——这也解决了你关于使用继承的问题——我建议看肖恩·帕伦特的演讲:继承是邪恶的基础类。
至于你应该走哪条路,这是一个更适合代码审查或软件工程等网站的意见问题。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 现代c++编译器会优化不可变的临时变量吗
- 现代编译器会优化只引用对象子集的局部变量吗
- 如何正确存储/传递接口类型的变量(现代 c++)?
- 将绝对地址强制转换为指针变量的现代C++方法是什么?
- 现代c++编译器是否会自动将局部变量初始化为0 ?