c – shared_ptr和this-pointer

好的,我开始使用共享指针并尽可能地传递共享指针.不再转换为原始指针.除了在这种特殊情况下,这很好用:

假设我们有一个类也是另一个类的观察者,如下所示:

class MyClass : public IObserver
   {
   public:
      MyClass (std::shared_ptr<SomeOtherClass> otherClass);
      void DoSomethingImportant();
   private:
      std::shared_ptr<SomeOtherClass> m_otherClass;
   };

这个类在我的应用程序中使用如下:

std::shared_ptr<MyClass> myInstance(new MyClass(otherInstance));
...
myInstance->DoSomethingImportant();

MyClass获取一个类的共享指针,并将其存储在m_otherClass数据成员中.
在DoSomethingImportant方法中,MyClass实例执行许多重要的操作,包括将自己注册为m_otherClass上的观察者,如下所示:

m_otherClass-> registerObserver(本);

问题是registerObserver方法的定义如下:

void registerObserver(std :: shared_ptr observer);

它需要一个共享指针,但’this’是一个原始指针,而不是一个共享指针.

我看到三种解决方法

>找到将普通指针转换为共享指针的技巧(参见问题convert pointer to shared_ptr),但该问题的答案仅建议复制共享指针,而不是如何将指针实际转换为共享指针.
>将共享指针传递给我们自己的方法,如下所示:“myInstance-> DoSomethingImportant(myInstance);”这似乎有点愚蠢.
>将观察者部分放入一个单独的类中.这看起来有点矫枉过正,可能会使课程更难理解.

这个问题很明显,共享指针只是C的附加组件(我不认为你在C#(或一般的.Net)和Java等其他语言/环境中遇到同样的问题).

关于如何处理这种情况的任何其他建议或窍门?

解决方法

你需要的可能是enable_shared_from_this和shared_from_this这些设施.文档是 here

请注意,在构造函数完全完成且对象已由另一个shared_ptr拥有之前,您不能使用shared_from_this.

struct test : boost::enabled_shared_from_this<test>
{
    test() {
       // shared_from_this(this); // error,still not owned by another shared_ptr
    }
    boost::shared_ptr<test> shared() {
       return shared_from_this(this);
    }
};
int main() {
   test * t = new test;
   // boost::shared_ptr<test> p = t->shared(); // error,not yet owned by other shared_ptr
   boost::shared_ptr<test> owner( t ); 
   boost::shared_ptr<test> p = t->shared();     // [*] ok,"owner" owns the object
}

[*]这部分示例很愚蠢,您可以将所有者复制到p中,而不是调用方法.只是在测试方法调用shared_from_this时可以注意到它.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...