我想要一个抽象类型的可选对象。 但是,对于抽象类型,boost :: optional失败:
#include <boost/optional.hpp>
class A {
virtual int getInt() = 0;
};
class B : public A {
int getInt() { return 666; };
};
int main() {
boost::optional<A> maybeAnA;
boost::optional<A> another(maybeAnA);
};
结果
error: invalid new-expression of abstract class type ‘A’
仅仅使用指针似乎也不是一个可行的解决方案,因为某些函数需要返回一个包含可选值作为成员的对象,尽管期望函数的调用者是其所有者是不合逻辑的。该成员变量。
答案 0 :(得分:9)
可选具有值语义,因此您无法执行所需操作,原因与您无法实例化A
本身相同:
A anA;
因为您似乎对将引用到可选值感兴趣,而不是拥有/包含:
您可以选择包含引用:
此库允许模板参数
T
具有引用类型:T&
,在某种程度上,T const&
。但是,由于引用不是真实对象,因此某些限制适用,并且在这种情况下某些操作不可用:
- 转换构造函数
- 转换作业
- InPlace建筑
- InPlace作业
- 通过指针进行价值访问
这种方式与传递A&
,但可选
<强> Live On Coliru 强>
#include <boost/optional.hpp>
struct A {
virtual int getInt() = 0;
};
struct B : A {
int getInt() { return 666; }
};
#include <iostream>
int main() {
boost::optional<A&> maybeAnA;
B b;
maybeAnA = b; // non owning, just the reference
boost::optional<A&> another(maybeAnA);
std::cout << another->getInt();
}
打印
666
如果您/ /希望optional
充当该类型的容器,您确实应该使用unique_ptr<A>
(它已经可以为空,可转让并拥有该资源)。
答案 1 :(得分:0)
你不能按照你想要的方式去做。
可选尝试创建A
类型的成员(在您的情况下)并且无法执行此操作。
我想到的唯一解决方案就是存储(智能)指针。