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