为 类 复制 shared_ptr<Interface> 的行为类似于值
Copying shared_ptr<Interface> for classes that act like values
这是我的问题。我有一个接口和两个派生的 classes:
class Interface
{
public:
virtual void f() = 0;
};
class Derived1 : public Interface;
class Derived2 : public Interface;
然后,我还有一个包含 shared_ptr 的值 class,其目的是指向两个派生的 classes:
之一
class Value
{
public:
Value();
Value(const Value&);
private:
shared_ptr<Interface> p_;
};
因为我希望我的 Value class 像一个值一样工作,所以我希望我的复制构造函数复制指向的 Derived 对象。但是,我不会写
Value::Value(const Value& value) :
p_(make_shared<Interface>(*value.p_))
{ }
as 接口包含纯虚函数。 *value.p_
必须是派生类型。我不知道如何正确处理这个问题。
提前致谢。
I don't know how to manage this problem properly.
为什么不使用虚拟 clone() 方法?
class Interface
{
public:
virtual void f() = 0;
virtual std::shared_ptr<Interface> clone()=0;
};
class Derived1 : public Interface {
void f() {};
std::shared_ptr<Interface> clone()
{
return std::make_shared<Derived1>(*this);
}
};
然后在你的复制构造函数中,你可以使用类似下面的东西来复制指针:
Value::Value(const Value& value)
{
this->p_ = value.p_->clone();
}
以这个为例:http://www.cs.technion.ac.il/users/yechiel/c++-faq/copy-of-abc-via-clone.html
这个问题正是提议的 polymorphic_value
旨在解决的问题(它赋予多态对象值语义)。
polymorphic_value<T>
可以拥有并执行从 T
.
派生的对象的深拷贝
ISO C++ 提案在这里 http://wg21.link/p0201
参考实现在这里https://github.com/jbcoe/polymorphic_value
我是论文和参考实现的作者。
我发现 polymorphic_value 在删除大量难以编写的样板代码方面很有用。我很想知道它是否也能解决您的问题。
这是我的问题。我有一个接口和两个派生的 classes:
class Interface
{
public:
virtual void f() = 0;
};
class Derived1 : public Interface;
class Derived2 : public Interface;
然后,我还有一个包含 shared_ptr 的值 class,其目的是指向两个派生的 classes:
之一class Value
{
public:
Value();
Value(const Value&);
private:
shared_ptr<Interface> p_;
};
因为我希望我的 Value class 像一个值一样工作,所以我希望我的复制构造函数复制指向的 Derived 对象。但是,我不会写
Value::Value(const Value& value) :
p_(make_shared<Interface>(*value.p_))
{ }
as 接口包含纯虚函数。 *value.p_
必须是派生类型。我不知道如何正确处理这个问题。
提前致谢。
I don't know how to manage this problem properly.
为什么不使用虚拟 clone() 方法?
class Interface
{
public:
virtual void f() = 0;
virtual std::shared_ptr<Interface> clone()=0;
};
class Derived1 : public Interface {
void f() {};
std::shared_ptr<Interface> clone()
{
return std::make_shared<Derived1>(*this);
}
};
然后在你的复制构造函数中,你可以使用类似下面的东西来复制指针:
Value::Value(const Value& value)
{
this->p_ = value.p_->clone();
}
以这个为例:http://www.cs.technion.ac.il/users/yechiel/c++-faq/copy-of-abc-via-clone.html
这个问题正是提议的 polymorphic_value
旨在解决的问题(它赋予多态对象值语义)。
polymorphic_value<T>
可以拥有并执行从 T
.
ISO C++ 提案在这里 http://wg21.link/p0201
参考实现在这里https://github.com/jbcoe/polymorphic_value
我是论文和参考实现的作者。
我发现 polymorphic_value 在删除大量难以编写的样板代码方面很有用。我很想知道它是否也能解决您的问题。