gpt4 book ai didi

c++11 - C++ 在 std::shared_ptr 中使用派生类

转载 作者:行者123 更新时间:2023-12-02 11:26:33 25 4
gpt4 key购买 nike

我有以下结构:

class A 
{
A(const A&) {...}
virtual int member() = 0;
virtual ~A() {};
}

class B : public A
{
virtual int member(){... }
virtual ~B(){}
}

class C : public A
{
virtual int member(){... }
virtual ~C(){}
}

并使用std::shared_ptr<A>作为我工厂的返回类型。

std::shared_prt<A> Factory::get(params...)
{
...

return std::make_shared<B>(params);
}

std::shared_ptr<A> Aptr = Factory::get(params...)

现在我尝试将其传递给外部方法:

boost::iostreams::filtering_istream

void push( const T& t,
std::streamsize buffer_size = default value,
std::streamsize pback_size = default value );

此调用在编译时失败,因为 some_external_function 尝试调用纯 member()属于 A 而不是 B。

concept_adapter.hpp:122:错误:无法将字段“boost::iostreams::detail::concept_adapter::t_”声明为抽象类型“A”

最佳答案

必须在这里使用 PImpl 习惯用法。

push方法要求第一个参数是可复制构造的。这意味着它被复制到 Boost 内部深处的某个地方。不好,因为你不能复制多态对象,它会被切片。

解决方案是拥有一个非多态类 APimpl包含一个指向 A 的指针(共享、唯一或原始,由您决定) ,并将调用转发到该指针。它可以自由复制,没有切片的不良影响。

class APimpl
{
public:
APimpl(std::shared_ptr<A> a) : p_a(a) {}
// compiler-generated copy ctor and assignment are OK here
void method() { p_a->method(); }
private:
std::shared_ptr<A> p_a;
};

您可能需要有 clone A中的方法并在复制 APimpl 时使用它,或者有 A APimpl 的多个实例之间共享。你想要哪一个取决于什么A做。我的示例演示了第二种情况。

关于c++11 - C++ 在 std::shared_ptr<baseclass> 中使用派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20377426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com