1

他のより専門的なグループから派生できるオブジェクトのグループのテンプレートクラスがあります(これを複合パターンに使用します)。とにかく、私のGroupクラスは実際のグループコードをすべて処理します。

現在、タイプ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()
};

したがって、グループでアクセスする必要がある2つのインターフェイスは、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;
    }
  }
}
4

1 に答える 1

0

おそらく内部のネストされたタイプ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マップを反復処理するとき、タイプはすでに。であることが保証されていますIShip

于 2012-04-15T06:11:47.543 に答える