C++ 子对象上的方法返回的奇怪值

C++ 子对象上的方法返回的奇怪值,c++,list,inheritance,constructor,C++,List,Inheritance,Constructor,我的派生类有点问题。基本上我有一个超类对象和一个派生类不可移动对象。我正在尝试向派生类添加一个布尔变量,以便稍后阅读它并查看对象是否可以移动。我遇到的问题是,我正在将所有对象(超级对象和派生对象)存储到列表清单中。每次从列表中读取值时,我都会得到isFixed()方法的一个奇怪值(204)。代码如下: //super class #pragma once #include "stdafx.h" class Object{ public: Object(); //constructor

我的派生类有点问题。基本上我有一个超类
对象
和一个派生类
不可移动对象
。我正在尝试向派生类添加一个布尔变量,以便稍后阅读它并查看对象是否可以移动。我遇到的问题是,我正在将所有对象(超级对象和派生对象)存储到
列表清单中。每次从列表中读取值时,我都会得到
isFixed()
方法的一个奇怪值(204)。代码如下:

//super class
#pragma once
#include "stdafx.h"

class Object{
public:
    Object(); //constructor
    Object(const string name, const string description); //constructor
    ~Object(); //destructor
private:
    string nameOfObject; //the name of the room
    string objectDescription; //the description of the room
};

//derived class

#pragma once
#include "stdafx.h"
#include "object.h"

//This class creates unmovable objects - the user can't pick them up.
class UnmovableObject : public Object {
public:
    UnmovableObject(string name, string description);
    UnmovableObject(const Object &object)  : Object(object){};
    bool isFixed();
private:
    bool fixed;
};

//the constructor of this class takes a boolean value (by default true) - the object is fixed in this room
UnmovableObject::UnmovableObject(string name, string description) : Object(name, description){
    this->fixed = true;
}

//returns false as the object is not movable
bool UnmovableObject::isFixed(){
    return this->fixed;
}

//other class
list<Object> inventory;
//超级类
#布拉格语一次
#包括“stdafx.h”
类对象{
公众:
对象();//构造函数
对象(常量字符串名称,常量字符串描述);//构造函数
~Object();//析构函数
私人:
string nameOfObject;//文件室的名称
string objectDescription;//房间的描述
};
//派生类
#布拉格语一次
#包括“stdafx.h”
#包括“object.h”
//此类创建不可移动的对象-用户无法拾取它们。
类UnmovableObject:公共对象{
公众:
不可移动对象(字符串名称、字符串描述);
UnmovableObject(const Object&Object):Object(Object){};
bool是固定的();
私人:
布尔固定;
};
//这个类的构造函数接受一个布尔值(默认为true)——对象在这个房间里是固定的
UnmovableObject::UnmovableObject(字符串名称,字符串描述):对象(名称,描述){
这个->固定=真;
}
//返回false,因为对象不可移动
bool UnmovableObject::isFixed(){
返回此->已修复;
}
//其他类
列出存货清单;

如何使用
inventory.push_back(对象/不可移动对象)
这样,当我尝试访问
库存时
我可以为所有库存获取正确的布尔值-
true
用于不可移动对象<对象的code>false

第一个问题称为切片。您是否将存储到
对象的列表中
仅复制派生类型的
对象
子对象。该列表将只包含
对象
。如果您需要多态行为,您需要在容器中使用(智能)指针,这样对象就不会被复制(只有指针)


第二个问题是,您不能希望获得类型中不存在的成员属性的值。也就是说,由于
对象
没有固定成员,因此无法获取其值。

第一个问题称为切片。您是否将存储到
对象的列表中
仅复制派生类型的
对象
子对象。该列表将只包含
对象
。如果您需要多态行为,您需要在容器中使用(智能)指针,这样对象就不会被复制(只有指针)


第二个问题是,您不能希望获得类型中不存在的成员属性的值。也就是说,由于
对象
没有固定的成员,因此您无法获取其值。

如果您想知道
对象
中是否有任何一个是固定的,那么您应该真正使
isFixed()
成为
对象
类的成员。然后在派生类中重写它。如果这样做,实际上不必存储
fixed
变量。此外,您应该将向量更改为指向
对象的指针向量

class Object
{
public:
    Object(); //constructor
    Object(const string name, const string description); //constructor
    ~Object(); //destructor
    virtual bool isFixed() {return false;}
private:
    string nameOfObject; //the name of the room
    string objectDescription; //the description of the room
};

class UnmovableObject : public Object {
public:
    UnmovableObject(string name, string description);
    UnmovableObject(const Object &object)  : Object(object){};
    virtual bool isFixed() {return true;}
};

vector<Object*> myVector;
类对象
{
公众:
对象();//构造函数
对象(常量字符串名称,常量字符串描述);//构造函数
~Object();//析构函数
虚拟bool isFixed(){return false;}
私人:
string nameOfObject;//文件室的名称
string objectDescription;//房间的描述
};
类UnmovableObject:公共对象{
公众:
不可移动对象(字符串名称、字符串描述);
UnmovableObject(const Object&Object):Object(Object){};
虚拟bool isFixed(){return true;}
};
向量myVector;

如果您想知道
对象
中是否有任何一个是固定的,那么您应该将
isFixed()
作为
对象
类的成员。然后在派生类中重写它。如果这样做,实际上不必存储
fixed
变量。此外,您应该将向量更改为指向
对象的指针向量

class Object
{
public:
    Object(); //constructor
    Object(const string name, const string description); //constructor
    ~Object(); //destructor
    virtual bool isFixed() {return false;}
private:
    string nameOfObject; //the name of the room
    string objectDescription; //the description of the room
};

class UnmovableObject : public Object {
public:
    UnmovableObject(string name, string description);
    UnmovableObject(const Object &object)  : Object(object){};
    virtual bool isFixed() {return true;}
};

vector<Object*> myVector;
类对象
{
公众:
对象();//构造函数
对象(常量字符串名称,常量字符串描述);//构造函数
~Object();//析构函数
虚拟bool isFixed(){return false;}
私人:
string nameOfObject;//文件室的名称
string objectDescription;//房间的描述
};
类UnmovableObject:公共对象{
公众:
不可移动对象(字符串名称、字符串描述);
UnmovableObject(const Object&Object):Object(Object){};
虚拟bool isFixed(){return true;}
};
向量myVector;

Hi。这意味着我必须修改所有代码,从存储和检索对象到指针?乌法阿,这需要一段时间。我真的希望有个窍门。谢谢不,当然有更高级的包装器可以用来管理这个间接寻址。在现代C++中,你很少应该编写<代码> */COD>,很少写<代码>新< /COD>,而且几乎从不写“代码>删除< /代码>。例如,签出
boost::ptr\u vector
。@Adrian或仅使用标准库,您可以在C++11中使用
共享的ptr
唯一的ptr
列表(TR1中也有共享指针。@KarlKnechtel我一直听到人们这样说,但我还没有看到很多解释。这个网站上有问题吗?或者你能给我指一本书吗?@Kazark:Google/search in以便查找智能指针及其用法。基本上,使用原始指针容易出错和泄漏(编写使用动态分配且不使用智能指针的异常安全代码几乎是不可能的)