首页 > 解决方案 > c-style this 或 shared_from_this 作为函数参数

问题描述

所以场景如下:基本上有一个MainControl,它有一个调度程序并调用一些函数。但是,调度程序MainControl必须Monitor通过MainControl. 此外,Monitor该类应该能够Dispatcher通过MainControl.

问题是我应该像 inthis那样使用智能指针传递指针,dispatcher.Init还是像 in 那样使用 C 样式指针传递指针monitor.Init()。或者有没有其他更好的方法。需要明确的是,我知道也可以this使用 c 样式引用传递指针。

Class MainControl : public std::enable_shared_from_this<MainControl>
{
public:
   void Init()
   {
       dispatched.Init(shared_from_this());
       monitor.Init(this);
   };
   Dispatcher &GetDispatcher() { return dispatcher;}
   Monitor &GetMonitor() { return monitor;}
   void DoSomeThing();

protected:
   Dispatcher dispatcher; 
   Monitor monitor;
};

class Dispatcher
{
public:
   void Init(shared_ptr<MainControl> ctrl)
   {
      mainCtrl = ctrl;
   };
   void DoSomethingFromMainController()
   {
      mainCtrl->DoSomething();
      mainCtrl->GetMonitor().DoSomething();
   };
   void DoSomethingElse();

protected:
   shared_ptr<MainControl> mainCtrl;
};

class Monitor
{
public:
   void Init(MainControl *ctrl)
   {
       mainCtrl = ctrl;
   }
   void DoSomethingFromDispatcher()
   {
       mainCtrl->GetDispatcher().DoSomethingElse();
   }
   void DoSomething();
protected:
   MainControl *mainCtrl;
};

标签: c++c++17

解决方案


还有其他方法,例如,根本没有对父级的引用:

class MainControl
{
public:
   void DoDispatcherWork() { dispatcher.DoSomethingFromMainController(*this, monitor);}
   void DoMonitorWork() { monitor.DoSomethingFromDispatcher(dispatcher); }
   void DoSomeThing();

protected:
   Dispatcher dispatcher; 
   Monitor monitor;
};

class Dispatcher
{
public:
   void DoSomethingFromMainController(MainControl& mainCtrl, Monitor& monitor)
   {
      mainCtrl.DoSomething();
      monitor.DoSomething();
   };
   void DoSomethingElse();
};

class Monitor
{
public:
   void DoSomethingFromDispatcher(Dispatcher& dispatcher)
   {
       dispatcher.DoSomethingElse();
   }
   void DoSomething();
};

推荐阅读