【发布时间】:2011-06-19 19:47:07
【问题描述】:
好的,我开始使用共享指针并尽可能地传递共享指针。不再转换为原始指针。这很好用,除了在这种特定情况下:
假设我们有一个类也是另一个类的观察者,像这样:
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(this);
问题是registerObserver方法是这样定义的:
void registerObserver (std::shared_ptr 观察者);
它需要一个共享指针,但“this”是一个原始指针,而不是共享指针。
我看到了解决这个问题的三种方法:
- 找到将普通指针转换为共享指针的技巧(请参阅问题convert pointer to shared_ptr),但该问题的答案仅建议复制共享指针,而不是关于如何实际将指针转换为共享指针.
- 将指向我们自己的共享指针传递给方法,如下所示:“myInstance->DoSomethingImportant(myInstance);”这似乎有点愚蠢。
- 将观察者部分放到一个单独的类中。这看起来有些矫枉过正,可能会使课程更难理解。
这个问题很明显,共享指针只是 C++ 的一个附加组件(我认为您在 C#(或一般的 .Net)和 Java 等其他语言/环境中没有同样的问题)。
关于如何处理这种情况的任何其他建议或技巧?
【问题讨论】:
-
你不能用
enable_shared_from_this吗? (见Getting a Boost shared_ptr from this) -
谁在否决这个问题和所有答案?这真的是一个愚蠢的问题吗?
-
我有时想知道...是否有些人不只是想获得徽章stackoverflow.com/badges/7/critic?userid=147192
-
正如其他提到的 enable_shared_from_this 将解决您的问题。然而,这里没有人提到的一件事是你应该小心,因为你正在做的是创建一个循环引用(即,主题对其观察者有一个 shared_ptr,而观察者对其主题有一个 shared_ptr。很容易创建以下情况:主体和观察者都成为不朽的:-)。
-
@ds27680:你是对的,详细说明:只有所有者应该维护 shared_ptr,所有其他用户都应该使用weak_ptr。对于观察者,您可以选择:保留一个 shared_ptr 必须在注销时重置或保留一个 weak_ptr 并在不再有效时清理。
标签: c++ this this-pointer shared-ptr