具有派生成员的基类的唯一指针

时间:2017-09-16 20:54:32

标签: c++ pointers inheritance

对于我的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();
}

1 个答案:

答案 0 :(得分:2)

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

#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();
}