我有一个指向父类的指针,我想有条件地为该指针分配一个新的子对象。现在,我的语法相当长:
std::unique_ptr<ParentClass> parentPtr;
if (...) {
parentPtr = std::unique_ptr<ParentClass>(new ChildClass1());
} else {
parentPtr = std::unique_ptr<ParentClass>(new ChildClass2());
}
有没有一种方法可以使这个更具可读性/更少长度?
答案 0 :(得分:2)
两种可能性是:
std::unique_ptr<ParentClass> parentPtr(condition ?
(ParentClass*)new ChildClass1() :
(ParentClass*)new ChildClass2());
如果条件复杂,只需为其指定一个布尔值,然后编写构造。此解决方案仅适用于二进制条件。
另一个是拥抱C ++ 14,并使用
parentPtr = std::make_unique<ChildClass>();
答案 1 :(得分:1)
首先,&#34;显而易见&#34;解决方案C ? new X : new Y
不起作用,因为即使X
和Y
具有公共基类A
,类型X *
和Y *
也没有普通类型。毕竟,如果你认为一个类可以有很多基础(直接或间接)并且给定的类型可能多次出现,那么这实际上并不令人惊讶。
您可以通过插入强制转换来使条件运算符工作:
A * = C ? static_cast<A *>(new X) : static_cast<A *>(new Y);
但是当你试图将它应用到你的真实情况时,这会很快变得冗长乏味。
但是,对于std::unique_ptr
,它提供了reset
函数,可以在此处起到良好的作用:
std::unique_ptr<A> p;
if (C)
{
p.reset(new X);
}
else
{
p.reset(new Y);
}
现在即使实际的new
表达式很长,这仍然可以很好地阅读。