考虑以下情况:
用
两个shared_ptr对象指向同一对象是否可以?(例如A::b_ptr和B::b_ptr)
如果这两个中的一个超出范围 - B的实例会被删除吗?
我猜我做错了一些根本性的事情。
我还考虑过将b_ptr注入B的构造函数,但那也似乎非常错误。
更新:
澄清一下 - A和B都需要使用C::c_func。反过来,在一些处理之后,C需要在B中调用回调函数,我没有在上面指定。 实际上有两种有趣的情况:
1. 如果有一个要求C不具有状态性的要求 - 那么它需要从A和B中都接收BPtr,就像上面的代码一样。 2. 如果C是有状态的,并且A和B实例化单独的C实例,则在C的ctor中给出BPtr。
typedef boost::shared_ptr<B> BPtr;
class A
{
public:
A() { b_ptr = BPtr(new B); }
void a_func() { C::c_func(b_ptr); }
private:
BPtr b_ptr;
}
class B
{
public:
B() { b_ptr = BPtr(this); }
void b_func() { C::c_func(b_ptr); }
private:
BPtr b_ptr;
}
class C
{
public:
static void c_func(BPtr b_ptr) { /*...*/ }
}
用
this
实例化shared_ptr是否可以?两个shared_ptr对象指向同一对象是否可以?(例如A::b_ptr和B::b_ptr)
如果这两个中的一个超出范围 - B的实例会被删除吗?
我猜我做错了一些根本性的事情。
我还考虑过将b_ptr注入B的构造函数,但那也似乎非常错误。
更新:
澄清一下 - A和B都需要使用C::c_func。反过来,在一些处理之后,C需要在B中调用回调函数,我没有在上面指定。 实际上有两种有趣的情况:
1. 如果有一个要求C不具有状态性的要求 - 那么它需要从A和B中都接收BPtr,就像上面的代码一样。 2. 如果C是有状态的,并且A和B实例化单独的C实例,则在C的ctor中给出BPtr。
this
实例化shared_ptr
意味着enable_shared_from_this
不应该存在,这是不正确的。这里的问题在于,将shared_ptr
作为成员变量指向this
是不可取的。 - Omnifariousthis
实例化一个新的shared_ptr
对象;这样做要么非常错误,要么就是完全不正确的。你可以使用安全的库提供的enable_shared_from_this
设施来_隐式_地这样做。虽然我几乎可以确定OP是在问显式形式。 - James McNellisenable_shared_from_this
要求在使用它之前必须通过“正常”方式创建一个shared_ptr
。 - bdonlanC
是否真的需要“拥有”B
对象?它一定要使用shared_ptr<B>
吗?或者可以改为使用B&
吗? - James McNellisshared_ptr
只应用于表达共享所有权,因此如果某些东西不需要对象的所有权,则引用或原始指针可能更合适(尽管这通常取决于具体情况)。如有任何进一步问题,请随时提问! - James McNellis