为不同的函数使用不同的参数

时间:2014-06-24 02:30:29

标签: c++

我有一个包含几个不同子类的类,我使用虚拟bool从std::list更新所有子类。但是,我想知道的是,如果我可以为不同的bool使用不同的参数,因为子类的行为不同,我不想通过提供无用的数据来容纳所有这些参数。

for (std::list<gameobject*>::iterator it = renderobjects.begin(); it != renderobjects.end(); ++it)
{
    if(!(*it)->update(arguments)){cout<<"error";}
}

有没有办法可以重写代码,以便为update()函数提供它所调用的特定子类所需的参数?

2 个答案:

答案 0 :(得分:0)

这会提供一些有用的信息来帮助您:http://www.cplusplus.com/forum/general/50090/

要点是你想做一个dynamic_cast并检查它是否成功。

更简单的替代方法是将字符串ClassID添加到定义它的每个类或子类。然后只检查该ClassID字符串。

if (fooObj.classID == "fooClass") { // do something }

答案 1 :(得分:0)

有几种方法可以解决这个问题:

  • 具有接受不同参数的update函数的重载,和/或
    • 然后你需要一些方法来解决哪一个打电话
  • update接受vector<>map<>等类型的参数,这些参数可以包含可变数量的逻辑参数,但是在类型安全中传递值时遇到问题方式,以及潜在的运行时错误(

你可以结合使用这些方法来减少缺点:

class gameobject
{
    ...

    enum Fields
    {
        ...  
    };

    tyepdef vector<Fields> Fields;
    virtual Fields get_fields_needed() const;
    typedef boost::variant<int, double, std::string, ...> Field_Types;
    virtual bool update(const vector<Field_Types>&);
};

...

for (std::list<gameobject*>::iterator it = renderobjects.begin(); it != renderobjects.end(); ++it)
{
    vector<Fields> needed = (*it)->get_fields_needed;
    vector<Field_Types> fields;
    for (Fields::const_iterator i = needed.begin(); i != needed.end(); ++i)
         switch (*i)
         {
           case Field_A: fields.push_back(Field_Types(a_value)); break;
           case Field_B: fields.push_back(Field_Types(b_value)); break;
           ...
         }
    if (!(*it)->update(fields)) { cerr << "error"; }
}

是否&#34;过度设计&#34;为了您的目的,将取决于您有多少功能,参数,参数组合等....