加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C将基类和派生类对象存储在一起

发布时间:2020-12-16 09:48:23 所属栏目:百科 来源:网络整理
导读:我有两节课: 第一: 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
我有两节课:

第一:

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,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",LOC2));

但在这种情况下,由于切片,函数Use(),Open()和isOpen()将无法访问.

您是否有一些建议,如何将这些对象存储在一起而不创建向量的新结构< Thing *>和矢量< Door *> ??

谢谢

解决方法

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

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

在这种情况下不会有切片,但你必须弄清楚什么时候可以调用Use(),Open()和isOpen().

如果你可以将派生类中的方法移动到基础中,那就去吧;如果你不能这样做,因为对于拥有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);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读