3

我有两节课:

第一的:

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*>??

谢谢

4

2 回答 2

6

当您需要具有多态行为的对象容器时,一个很好的解决方案是唯一指针向量:

std::vector<std::unique_ptr<Thing>>

在这种情况下不会进行切片,但是您必须弄清楚何时可以调用Use(),Open()isOpen().

如果您可以将派生类中的方法移动到基类中,那就去吧;如果您因为 a Thingto have没有意义而无法这样做isOpen(),请考虑使用更高级的解决方案,例如Visitor Pattern

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);
    }
}
于 2013-10-30T14:21:56.737 回答
1

存储指针而不是实例,并在基类中将公共和受保护的方法声明为虚拟。

于 2013-10-30T14:21:46.417 回答