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

马贾克

我有两节课:

第一的:

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

谢谢

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

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

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

会有在这种情况下没有分层,但你必须要弄清楚,当它的好打电话Use()Open()isOpen()

如果您可以将方法从派生类移到基类中,请继续;否则,请执行以下步骤。如果你不能这样做,因为它是没有意义的ThingisOpen(),可以考虑使用更先进的解决方案,如访问者模式

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

C ++中基础类和派生类对象的Tree结构

来自分类Dev

创建类型为<派生类>的变量以将<基类>对象存储在C#中

来自分类Dev

使用Swig将C ++ for Python的多个类包装在一起

来自分类Dev

将C#中的两个列表对象连接在一起

来自分类Dev

C ++:将istream和ostream +覆盖流运算符捆绑在一起

来自分类Dev

在C++中将抽象基类的不同派生类的对象存储在数组中

来自分类Dev

C ++中基类对象和派生类对象的大小

来自分类Dev

C#:将基类集合对象复制到派生类对象中

来自分类Dev

C ++派生类

来自分类Dev

派生类C ++

来自分类Dev

在 C# 中使用基类和派生类实例化数组中的对象

来自分类Dev

C# 如何使用隐藏的代码将类的 observableCollection 与可观察的集合绑定在一起

来自分类Dev

如何将CRTP中的模板化派生类与派生类表达模板结合在一起?

来自分类Dev

Linq-将List <B>与List <B>中的C对象组合在一起的项目List <A>

来自分类Dev

将参数限制为C ++中的特定类和派生类

来自分类Dev

包含基类/派生类对象的C ++数组

来自分类Dev

包含基类/派生类对象的C ++数组

来自分类Dev

C ++基类和派生类方法的麻烦

来自分类Dev

C#创建类和派生类的实例

来自分类Dev

C ++抽象类和创建派生类

来自分类Dev

基类和派生类 c++11

来自分类Dev

访问派生类对象的字段,C ++与Java

来自分类Dev

如何区分派生类的对象C ++

来自分类Dev

c#使用派生类时的对象类型

来自分类Dev

从C ++中另一个(不相关!)类的基类引用派生类的对象

来自分类Dev

C ++ Qt派生类

来自分类Dev

C ++派生类数组

来自分类Dev

C ++派生类和虚拟析构函数

Related 相关文章

热门标签

归档