对于我的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();
}
答案 0 :(得分:2)
您的代码有几处错误。首先,您不能有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();
}