У меня есть два интерфейса: 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*)
.Я также хотел бы реализовать паттер Observer для Network
и Controller
.
Теперь основной проблемой является то, что я не уверен, как правильно реализовать все мои идеи, используя современный C ++11/14 подходов.Должен ли я хранить INetwork
и IController
простой указатель внутри App
или я должен использовать std::shared_ptr
здесь?Как хранить и передавать ссылки на INetwork
в IController
и наоборот?Есть ли какие-либо проблемы с наследованием?
C ++ предоставляет несколько инструментов, и я немного растерялся.
TL & DR
- Должен ли я использовать необработанный указатель или лучшепереключиться на std :: shared_ptr?
- Что вы думаете о схеме наследования?