我想实例化一个基类指针,指向一个新构造的派生类对象。对象的实际类将根据应用程序类型而改变,因此我想使用Factory方法打开某些变量以构造正确的对象。
但是我不想每次都要进行切换。事实上,一旦应用程序启动,我想在这种情况下创建的对象类型将始终相同 - 所以实际上我只需要只切换一次。
我可以将派生类构造函数传递给创建对象的函数吗?
例如:
typedef DerivedObject (*DerivedClassConstructor)( void );
class ContainingClass:
{
public:
ContainingClass ( DerivedClassConstructor * f )
{
baseptr = f();
}
BaseClass * baseptr
};
有更好的设计吗?
答案 0 :(得分:2)
对代码进行模板处理会不会更容易 这样看起来就像普通代码一样。
class BaseClass
{};
class Derived: public BaseClass
{};
template<typename T>
class ContainingClass
{
public:
ContainingClass()
{
baseptr = new T();
}
BaseClass * baseptr;
};
int main()
{
ContainingClass<Derived> cont;
}
答案 1 :(得分:1)
我认为这很理智。只需传递一个函数对象并保存它,因为它似乎需要稍后再调用它(否则为什么不直接传递指针并在之前创建对象?)
class ContainingClass:
{
public:
typedef boost::function<BaseClass*()> factory_fn;
public:
ContainingClass (factory_fn f )
:m_f(f)
{
baseptr = m_f();
}
BaseClass * baseptr
factory_fn m_f;
};
template<typename T>
struct DerivedFactory {
BaseClass *operator()() {
return new T;
}
};
ContainingClass c((DerivedFactory<DerivedClass>()));
答案 2 :(得分:1)
您无法使用构造函数执行此操作,因为构造函数实际上并未返回类实例。
你谈到了一种工厂方法,你实际使用了一种方法。但是,创建从基类到派生类的依赖关系并不是一个好主意 - 为什么工厂方法不能简单地返回(指向BaseClass
个对象的指针?
typedef BaseClass* (*BaseClassFactory)( void );