1
我有一个对象组的模板类,其他更专业的组可以派生自(使用此组合模式)。无论如何,我的Group类会处理所有的实际组代码。Dynamic Cast or Second Container of Objects?
现在我有一个容器存放类型为T的对象,但我也需要通过交叉转换来访问另一个基类的接口。你建议我有一个容器的两个接口或只是dynamic_cast每个对象,因为我循环通过第一个容器?
class Sim_object {
add(Sim_object_sp_t object)
remove(Sim_object_sp_t object)
};
class Group<T> : public class Sim_object {
add(Sim_object_sp_t object)
remove(Sim_object_sp_t object)
map<T>
protected iterators begin(), end() (for use by Ship_group to use for dock, attack, move functions)
// looking to add map<Sim_object> to prevent casting from T to Sim_object in Add/Remove but still give derived classes access to map<T> iterators.
};
class IShip {
dock() = 0
attack() = 0
move() = 0
};
class Ship_group : public Group<IShip>, public IShip {
dock() // uses iterators provided by Group to loop through and call dock()
attack() // same as dock
move() // same as dock
};
class Ship : public Sim_object, public IShip {
dock()
attack()
move()
};
所以我需要在组中访问的两个接口是T(IShip在这种情况下)和Sim_object。从组
示例:从Ship_group
template<typename T>
void Group<T>::add(Sim_object_sp_t object) {
if (object->get_parent())
object->get_parent()->remove(object);
std::tr1::shared_ptr<T> t_object = std::tr1::dynamic_pointer_cast<T>(object);
if (!t_object)
throw Error("Failed to cast to type T");
objects[object->get_name()] = t_object;
object->set_parent(shared_from_this());
}
实施例:
void Ship_group::set_destination_position_and_speed(Point destination_position, double speed) {
for (Iterator it = begin(); it != end(); ++it) {
try {
it->second->set_destination_position_and_speed(destination_position, speed);
} catch (const Error& e) {
cout << it->second->get_name() << " -- " << e.msg << endl;
}
}
}
“Group”类的所有用法都需要'T'来获得所需的接口吗?如果是这样,我认为你可以编程你的'Group'模板,假设所有'T'都有所需的接口(不需要'dynamic_cast')。实例化任何类型不符合条件的类型“T”的“Group”模板类时,模板编译器都会失败。 – 2012-04-15 04:26:40
我不确定这是否是正确的响应,但现在我从组中派生Ship_group类,其中IShip是所有类Ship对象的抽象基类。所以我真的不想污染T.我也有一个Sim_object类,该类继承自组合模式,并执行组合函数作为组合模式的一部分。我不想污染任何一个界面,所以我可以避免使用dynamic_cast。这是否回答你的问题? –
keelerjr12
2012-04-15 04:30:08
如果您可以勾画出刚才描述的类层次结构的框架代码,那将会很有帮助。你可以把这个添加到你的问题吗? – 2012-04-15 04:34:46