【问题标题】:unique pointer of base class with derived member具有派生成员的基类的唯一指针
【发布时间】:2018-02-25 18:06:58
【问题描述】:

对于我的 C++ 程序,我有很多类,其中成员应该属于具有相同基类的两种类型之一。

我以为我可以用指针来实现它,但我没有让它工作。

示例:假设我们有一个类 A 和一个类 B 的成员 b_:

class A{
public:
    A(B b): b_{b} {}
private:
    B b_;
}

B类只有一个纯虚函数:

class B{
public:
    virtual void print() = 0;
}

现在我有 B 的两个派生类,我想以某种方式更改 A,使其可以容纳 B1 或 B2 类的对象:

class B1: public B{
public:
    void print(){cout << "B1\n";}
}    

class B2: public B{
public:
    void print(){cout << "B2\n";}
}

我的计划是使用唯一指针:

class A{
public:
    A(std::unique_ptr<B> b): b_{std::move(b)} {}
private:
    std::unique_ptr<B> b_;
}

int main(){

std::unique_ptr<B> b;
if (some condition){
    b = make_unique<B1>(new B1()) ///?
}else{
    b = make_unique<B2>(new B2()) ///?
}
A(b);
A.getB()->print();
}

【问题讨论】:

  • b = make_unique&lt;B1&gt;(new B1())??? ... 你是说 b = make_unique&lt;B1&gt;()?
  • 错误是什么?

标签: c++ pointers inheritance


【解决方案1】:

您的代码有几个错误。首先,A 不能有两个定义。其次,您必须将 unique_ptr 作为 r 值引用 (std::move) 传递,因为它不可复制。最后,创建一个A (a) 类型的变量,然后对其调用方法。

#include <memory>
#include <iostream>

using namespace std;

class B{
public:
    virtual void print() = 0;
    virtual ~B() {};
};

class B1: public B{
public:
    void print(){cout << "B1\n";}
};

class B2: public B{
public:
    void print(){cout << "B2\n";}
};

class A{
public:
    A(std::unique_ptr<B> b): b_{std::move(b)} {}
    auto *getB() { return b_.get(); }
private:
    std::unique_ptr<B> b_;
};

int main()
{
    std::unique_ptr<B> b;
    if(false)
        b = make_unique<B1>();
    else
        b = make_unique<B2>();

    A a(std::move(b));
    a.getB()->print();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 2016-02-23
    • 1970-01-01
    • 2016-07-31
    • 2016-10-10
    • 2020-02-28
    • 2021-12-03
    相关资源
    最近更新 更多