我有两节课:
第一的:
class Thing {
public:
int code;
string name;
string description;
int location;
bool canCarry;
Thing(int _code, string _name, string _desc, int _loc, bool _canCarry) {
code = _code;
name = _name;
description = _desc;
location = _loc;
canCarry = _canCarry;
}
};
第二:
class Door: public Thing {
private:
bool open;
public:
int targetLocation;
Door(int _code, string _name, string _desc, int _loc, int _targetLoc) :
Thing(_code, _name, _desc, _loc, false) {
open = false;
targetLocation = _targetLoc;
}
void Use() {
open = true;
}
void Close() {
open = false;
}
bool isOpen() {
return open;
}
};
忘记私人/公共属性...
我需要存储一些基类的对象和一些派生类的对象,如下所示:
vector < Thing*> allThings;
things.push_back(new Thing(THING1, "THING1", "some thing", LOC1, true));
things.push_back(new Door(DOOR1, "DOOR1", "some door", LOC1, LOC2));
但是在这种情况下,由于切片,将无法使用Use(),Open()和isOpen()函数。
你有一些建议,如何把这些对象一起存储,而无需创建新的结构vector<Thing*>
和vector<Door*>
?
谢谢
当您需要一个具有多态行为的对象的容器时,一个很好的解决方案是唯一指针的向量:
std::vector<std::unique_ptr<Thing>>
会有在这种情况下没有分层,但你必须要弄清楚,当它的好打电话Use()
,Open()
和isOpen()
。
如果您可以将方法从派生类移到基类中,请继续;否则,请执行以下步骤。如果你不能这样做,因为它是没有意义的Thing
有isOpen()
,可以考虑使用更先进的解决方案,如访问者模式:
class Thing;
class Door;
struct Visitor {
virtual void visitThing(Thing &t) = 0;
virtual void visitDoor(Door &d) = 0;
};
class Thing {
...
virtual void accept(Visitor &v) {
v.visitThing(*this);
}
};
class Door : public Thing {
...
virtual void accept(Visitor &v) {
v.visitDoor(*this);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句