我可以将构造函数传递给函数吗?

时间:2010-09-16 11:51:22

标签: c++

我想实例化一个基类指针,指向一个新构造的派生类对象。对象的实际类将根据应用程序类型而改变,因此我想使用Factory方法打开某些变量以构造正确的对象。

但是我不想每次都要进行切换。事实上,一旦应用程序启动,我想在这种情况下创建的对象类型将始终相同 - 所以实际上我只需要只切换一次。

我可以将派生类构造函数传递给创建对象的函数吗?

例如:

typedef DerivedObject (*DerivedClassConstructor)( void );
class ContainingClass:
{
public:
    ContainingClass ( DerivedClassConstructor * f ) 
    {
       baseptr = f();
    }

    BaseClass * baseptr
};

有更好的设计吗?

3 个答案:

答案 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 );