C++ 如何从向量返回给定类型的元素?

C++ 如何从向量返回给定类型的元素?,c++,polymorphism,rtti,dynamic-cast,C++,Polymorphism,Rtti,Dynamic Cast,我有一个类,EscapeRoomWrapper,还有两个派生自它的类,ScaryRoom和KidsRoom 在另一个类中,Company,我添加了一个指向所有房间对象的vector(EscapeRoomWrapper,ScaryRoom,和KidsRoom)指针。我想在Company类中编写一个函数,在这里我给它一个房间类型,它应该返回所有房间的向量中存在的该类型的所有房间 我曾想过使用typeid,但教授禁止我们使用它。我的最后一个想法是使用dynamic\u cast typedef enu

我有一个类,
EscapeRoomWrapper
,还有两个派生自它的类,
ScaryRoom
KidsRoom

在另一个类中,
Company
,我添加了一个指向所有房间对象的
vector
EscapeRoomWrapper
ScaryRoom
,和
KidsRoom
)指针。我想在
Company
类中编写一个函数,在这里我给它一个房间类型,它应该返回所有房间的
向量中存在的该类型的所有房间

我曾想过使用
typeid
,但教授禁止我们使用它。我的最后一个想法是使用
dynamic\u 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
};
typedef枚举{
恐怖室,儿童室,基地室
}房间类型;
阶级公司{
字符串公司名称;
病媒室;
公众:
std::vector和getAllRoomsByType(RoomType类型)常量;
};
类转义包装器{
逃生室;
向量之谜;
公众:
//这里的功能
};
ScaryRoom类:公共转义包装器{
私人:
国际年龄限制;
国际货币基金组织;
公众:
//育婴室的功能
};
KidsRoom类:公共转义包装器{
私人:
国际年龄限制;
公众:
//儿童房的功能
};
有没有关于如何实现此功能的想法

std::vector<EscapeRoomWrapper*>& getAllRoomsByType(RoomType type) const
std::vector&getAllRoomsByType(RoomType类型)常量

您认为可以使用
dynamic\u 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;
}
或者,您可以为每种房间类型存储单独的列表:

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*>();
}
class公司{
...
病媒金龟子;
性病:病媒儿童房;
所有房间;
公众:
std::vector getAllRoomsByType(RoomType类型)常量;
};
std::vector公司::getAllRoomsByType(RoomType类型)常量
{
开关(类型){
案例室:
返回圣甲虫;
案例室:
返回儿童屋;
病例室:
归还所有房间;
}
返回std::vector();
}

对于jasmin,很抱歉,我取消了您的编辑“我的坏”。这很好,感谢编辑。您可以创建所有类型的枚举,并为每个类分配一个枚举,然后选择该方式。它比字符串比较便宜。shrugok,所以我添加了Enum,但我仍然不明白如何根据dynamic cast的类型找到所有房间的集合
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*>();
}