2017-06-28 1 views
0

私はクラスEscapeRoomWrapperとそれに由来する2つのクラスScaryRoomKidsRoomを持っています。別のクラスにおいてベクトルから与えられた型の要素を返すには?

Companyは、私はすべての部屋のオブジェクト(EscapeRoomWrapperScaryRoom、及びKidsRoom)へのポインタのvectorを添加しました。私はCompanyクラスに関数を書く必要があります。私はそれに部屋の型を与え、それはすべての部屋のvectorに存在するそのタイプの部屋を返すべきです。

私はtypeidを使用することを考えましたが、教授は私たちにそれを使用することを禁止しました。私の最後のアイデアはdynamic_castです。

typedef enum{ 
    SCARY_ROOM, KIDS_ROOM, BASE_ROOM 
}RoomType; 

class Company{ 
    string CompanyName; 
    std::vector<EscapeRoomWrapper*> Rooms; 

public: 
    std::vector<EscapeRoomWrapper*>& getAllRoomsByType(RoomType type) const; 
}; 

class EscapeRoomWrapper{ 
    EscapeRoom room; 
    std::vector<Enigma> Enigmas; 
public: 
    // functions here 
}; 

class ScaryRoom : public EscapeRoomWrapper { 
private: 
    int ageLimit; 
    int NumOfScaryEnigmas; 
public: 
    // functions for escary room 
}; 

class KidsRoom : public EscapeRoomWrapper { 
private: 
    int ageLimit; 
public: 
    // functions for kidsroom 
}; 

この機能をどのように実装できますか?

std::vector<EscapeRoomWrapper*>& getAllRoomsByType(RoomType type) const 
+0

ジャスミンに、申し訳ありませんが、私はあなたの編集をキャンセルします。 – Stargateur

+0

編集に感謝です – jasmin

+0

あなたが持っているすべてのタイプの列挙型を作成し、各クラスに1つずつ割り当ててその方法を選択することができます。それは文字列比較より安いです。 * shrug * –

答えて

1

あなたは例えば、あなたがdynamic_castを使用することができます考えて正しい軌道に乗っている:

class Company { 
    ... 
    std::vector<EscapeRoomWrapper*> Rooms; 
public: 
    std::vector<EscapeRoomWrapper*> getAllRoomsByType(RoomType type) const; 
}; 

std::vector<EscapeRoomWrapper*> Company::getAllRoomsByType(RoomType type) const 
{ 
    std::vector<EscapeRoomWrapper*> result; 

    switch (type) { 
     case SCARY_ROOM: 
      for (size_t i = 0; i < Rooms.size(); ++i) { 
       if (dynamic_cast<ScaryRoom*>(Rooms[i])) { 
        result.push_back(Rooms[i]); 
       } 
      } 
      break; 

     case KIDS_ROOM: 
      for (size_t i = 0; i < Rooms.size(); ++i) { 
       if (dynamic_cast<KidsRoom*>(Rooms[i])) { 
        result.push_back(Rooms[i]); 
       } 
      } 
      break; 

     case BASE_ROOM: 
      result = Rooms; 
      break; 
    } 

    return result; 
} 

しかし、dynamic_castは、いくつかの実行時のオーバーヘッドを持っており、それは(クラスのためのRTTIを生成するコンパイラに依存しますそれはデフォルトで行いますが、を無効にすることができます)。利用可能な他の解決策があります。

あなたが各クラスを持つように仮想関数を定義することができますがenumからその型を報告し、あなたは、これらのタイプの値を見ることができます。

class EscapeRoomWrapper { 
    ... 
public: 
    ... 
    virtual RoomType getRoomType() const { return BASE_ROOM; } 
}; 

class ScaryRoom : public EscapeRoomWrapper { 
    ... 
public: 
    ... 
    RoomType getRoomType() const { return SCARY_ROOM; } 
}; 

class KidsRoom : public EscapeRoomWrapper { 
    ... 
public: 
    ... 
    RoomType getRoomType() const { return KIDS_ROOM; } 
}; 

std::vector<EscapeRoomWrapper*> Company::getAllRoomsByType(RoomType type) const 
{ 
    std::vector<EscapeRoomWrapper*> result; 

    for (size_t i = 0; i < Rooms.size(); ++i) { 
     if ((Rooms[i]->getRoomType() == type) || (type == BASE_ROOM)) { 
      result.push_back(Rooms[i]); 
     } 
    } 

    return result; 
} 

それとも、あなただけの各部屋タイプのために別々のリストを保存することができます:

class Company { 
    ... 
    std::vector<EscapeRoomWrapper*> ScaryRooms; 
    std::vector<EscapeRoomWrapper*> KidsRooms; 
    std::vector<EscapeRoomWrapper*> AllRooms; 
public: 
    std::vector<EscapeRoomWrapper*> getAllRoomsByType(RoomType type) const; 
}; 

std::vector<EscapeRoomWrapper*> Company::getAllRoomsByType(RoomType type) const 
{ 
    switch (type) { 
     case SCARY_ROOM: 
      return ScaryRooms; 

     case KIDS_ROOM: 
      return KidsRooms; 

     case BASE_ROOM: 
      return AllRooms; 
    } 

    return std::vector<EscapeRoomWrapper*>(); 
} 
+0

私は泣くだろう!あなたはそれほど私はあなたにこれについて十分にあなたに感謝することはできません! – jasmin

関連する問題