将类的实例返回给main

时间:2012-11-07 17:43:09

标签: c++ templates

我的程序从配置文件中读取并使用每个特定部分的内容实例化几个类。

要初始化Voice课程,我打电话给:

initializeDomain ("voice", voice_config, voice_config_fields);

Voice应初始化为:

Voice voice ( config, config_fields );

为此,我编写了以下功能:

void initializeDomain (string dom, map<string, string> & config, map<string, string> & config_fields)
{
    if ( dom == "voice" ) {
        Voice voice ( config, config_fields );
        return voice;
    } else if ( dom == "account" ) {
        Account account (config, config_fields);
        return account;
    }
}

这显然不起作用,因为返回类型是可变的,具体取决于实例化的类。所以,我尝试构建一个可以满足这种需求的模板:

template <typename T>
T initializeDomain (string dom, map<string, string> & config, map<string, string> & config_fields)
{
    if ( dom == "voice" ) {
        T instantiated ( config, config_fields );
    } else if ( dom == "account" ) {
        T instantiated ( config, config_fields );
    }
    return instantiated;                                                          }
}

但它也不起作用。如何在模板中实例化不同的类?

3 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,我建议您使用工厂模式以允许您输入各种类型并返回所需的实例。我希望有所帮助。

答案 1 :(得分:2)

这看起来像Factory Design Pattern的经典应用程序。动态分配实例并通过[智能]指针返回:

class Base {};
class DerivedOne : public Base {};
class DerivedTwo : public Base {};

typedef std::unique_ptr<Base> BasePtr;

BasePtr createFoo( /* arguments */ ) {
    BasePtr ptr; // initialized to nullptr
    if ( ... ) ptr.reset( new DerivedOne );
    else if ( ... ) ptr.reset( new DerivedTwo );
    else ...

    return ptr;
}

编辑0:

上述设置的用法是针对多态类型,即当您有不同实现的公共接口时,因此您将通过指针<调用虚拟方法 / em>,喜欢:

BasePtr base = createFoo( /* args */ );
base->callVirtualFunction( /* args */ );

你所说的有点奇怪。 C ++是强类型语言,即您不能将不相关类型的实例存储到同一变量中。您描述的简单案例如下所示:

std::string value = getInputSomewhere();

if ( value == "voice" ) {
    Voice v( /* ctor args */ );
    // do your voice stuff here
} else if ( value == "account" ) {
    Account a( /* ctor args */ );
    // do your account stuff here
} else {
    // ...
}

所以我真的没有看到你想用这个模板完成什么。

答案 2 :(得分:1)

如果没有一些假设,它可能不完全适合这个问题,但是我们必须继续这样做,我将不得不同意工厂模式。

祝你好运,请告诉我们你是如何解决这个问题的?