我有一个包含几个不同子类的类,我使用虚拟bool从std::list
更新所有子类。但是,我想知道的是,如果我可以为不同的bool使用不同的参数,因为子类的行为不同,我不想通过提供无用的数据来容纳所有这些参数。
for (std::list<gameobject*>::iterator it = renderobjects.begin(); it != renderobjects.end(); ++it)
{
if(!(*it)->update(arguments)){cout<<"error";}
}
有没有办法可以重写代码,以便为update()
函数提供它所调用的特定子类所需的参数?
答案 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;为了您的目的,将取决于您有多少功能,参数,参数组合等....