c++ - 对象的动态转换或第二个容器?

标签 c++ inheritance casting polymorphism

我有一组对象的模板类,其他更专业的组可以从中派生(将其用于复合模式)。不管怎样,我的 Group 类处理所有实际的组代码。

现在我有一个容器,其中包含类型 T 的对象,但我还需要通过交叉转换访问另一个基类的接口(interface)。你建议我为两个接口(interface)都使用一个容器,还是在循环遍历第一个容器时只对每个对象进行 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()
};

所以我需要在 Group 中访问的两个接口(interface)是 T(在本例中为 IShip)和 Sim_object。

来自组的示例:

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());
}

来自 Ship_group 的示例:

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;
    }
  }
}

最佳答案

可能是 class Group<T> 中的嵌套类型:

class Group<T> : public class Sim_object {
    class Specialized_Sim_Object : public T, public Sim_object {}
    void add(Specialized_Sim_Object * object) {
        objects[object->get_name()] = object;
    }
}

shared_ptr在这种情况下可能也没有必要 - 当 Ship_group遍历 map ,类型已经保证是 IShip .

关于c++ - 对象的动态转换或第二个容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10159449/

相关文章:

android - 如何删除 QCalendarWidget 中的选定日期矩形和小部件中的小图标

c++ - 如何使用 boost::bind 从参数中动态提取数据

c++ - std::any_cast 不需要原始对象的类型

javascript - 原型(prototype)继承(javascript)

c++ - C++ 中子类从基类继承了什么?

C++ : Storing weight for larger Graph

java - 接口(interface)和工厂模式的问题

java - 将枚举转换为列表

不同目标的 C++ 转换(编译器)

go - 我如何在golang中将字符串转换为整数