【发布时间】:2014-05-18 14:18:11
【问题描述】:
我有以下代码:
struct A : boost::noncopyable {
virtual A& copy (const A&);
};
struct B : A {
virtual B& copy (const B&);
};
typedef boost::shared_ptr <A> APtr;
typedef boost::shared_ptr <B> BPtr;
typedef std::string Key;
struct AFactory {
static APtr s_get (const Key& key) {
APtr a;
//... //some factory code
return a;
}
};
这是C类的旧实现,以及用法
class COld {
public:
void get (APtr a) {
a->copy (*_a) ;
}
private:
Key _key;
APtr _a;
};
int main (void) {
APtr a = AFactory::s_get ("b"));
BPtr b = boost::dynamic_pointer_cast <B> (AFactory::s_get ("b"));
COld c;
c.get (a); //works good
c.get (b); //works good
return 1;
}
我试图对用户更友好,如果传递的对象为NULL,则分配它
class CNew {
public:
void get (APtr& a) {
if (!a) {
a = AFactory::s_get (_key);
}
a->copy (*_a) ;
}
private:
Key _key;
APtr _a;
};
int main (void) {
//current usage
APtr a;
BPtr b;
APtr ap = boost::dynamic_pointer_cast <A> (b);
CNew c;
c.get (a);
c.get (b); // here I get the error:
c.get (ap); // ok, but i don't like it
return 1;
}
错误:“APtr &”类型的引用(非 const 限定)不能用“BPtr”类型的值初始化
确定用户可以将 BPtr 转换为 APtr 以传递给 c.get():
APtr ap = boost::dynamic_pointer_cast <A> (b);
c.get (ap);
但这不是很优雅
我不想共享来自 C::_a 的指针,只是复制数据 如何使 C::get () 的新实现工作方便?
【问题讨论】:
-
如果您的示例代码至少在语法上是正确的,这将很有帮助。在这种情况下,您应该能够为我们提供一个编译和演示问题的最小示例,不是吗?
-
@Rook 代码我修好了,不过不用编译你也能理解问题
-
代码不固定...
AFactory的定义完全被破坏,s_get是私有的,你使用了Class而不是class,等等。跨度> -
您也不能将
B*传递给期望A*&的函数,并且出于同样的原因:您最终会得到一个指向B的指针,其中包含实际上是指针的内容到A。 -
你可以只返回一个共享指针,返回一个引用是个坏主意。你可以从
B*构造一个shared_ptr<A>;这是安全和合法的。反过来说,你似乎在尝试,两者都不是。
标签: c++ inheritance boost shared-ptr factory