我有很多类来自纯粹的虚拟基础:
class base {
public:
virtual int f() = 0;
};
class derived_0 : public base {
public:
int f() {return 0;}
};
class derived_1 : public base {
public:
int f() {return 1;}
};
为了简洁,我只放了两个派生类,但实际上我还有更多。
我想创建一个具有const共享指针的类。我想做以下但我不能,因为我必须初始化初始化列表中的const指针:
class C{
public:
C(bool type) {
if(type) {
derived_0* xx = new derived_0;
x = shared_ptr<base>( xx );
}
else {
derived_1* xx = new derived1;
x = shared_ptr<base>( xx );
}
}
private:
const share_ptr<base> x;
};
如何获得此功能?
答案 0 :(得分:6)
您将对象的创建封装在函数中,如下所示:
shared_ptr<base> create_base(bool type) {
if(type) {
return make_shared<derived_0>();
}
else {
return make_shared<derived_1>();
}
}
然后你可以在初始化列表中使用它:
class C{
public:
C(bool type)
: x(create_base(type))
{}
private:
const share_ptr<base> x;
};
答案 1 :(得分:3)
在这种简单的情况下,例如:
class C
{
shared_ptr<Base> const x;
public:
C( bool type )
: x( type
? static_cast<Base*>( new Derived_0 )
: static_cast<Base*>( new Derived_1 ) )
{
}
};
(是的,static_cast
或至少其中一个是必要的。)
在更一般的情况下,决策逻辑更复杂,你
可能想创建一个返回shared_ptr
的静态函数,
e.g:
class C
{
shared_ptr<Base> const x;
static shared_ptr<Base> makeSharedPtr( bool type );
public:
C( bool type )
: x( makeSharedPtr( type ) )
{
}
};
这将允许任何可以想象的逻辑(和更复杂的一组) 参数以及。)