Странное значение, возвращаемое методом для дочернего объекта - PullRequest
1 голос
/ 16 марта 2012

У меня небольшая проблема с моим производным классом. В основном у меня есть суперкласс Object и производный класс UnmovableObject. Я пытаюсь добавить булеву переменную в производный класс, чтобы позже я смог прочитать ее и посмотреть, могут ли мои объекты быть перемещены или нет. У меня проблема в том, что я храню все объекты (супер и производные) в list<Object> inventory. Каждый раз, когда я читаю значения из списка, я получаю странное значение (204) для метода isFixed(). Это код:

//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;

Как я могу использовать inventory.push_back(Object/UnmovableObject);, чтобы при попытке доступа к inventory я мог получить правильное логическое значение для всех из них & mdash; true для UnmovableObject; false для объекта.

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Первая проблема называется нарезкой.Когда вы сохраняете в список Object, копируется только подобъект Object производного типа.Список будет содержать только Object.Если вам нужно полиморфное поведение, вам нужно использовать (умные) указатели в контейнере, чтобы объекты не копировались (только указатели).

Вторая проблема заключается в том, что вы не можете надеяться получить значениеатрибута члена, который не существует в вашем типе.То есть, поскольку Object не имеет фиксированного члена, вы не можете получить его значение.

1 голос
/ 16 марта 2012

Если вы хотите узнать, являются ли какие-либо из Object фиксированными, тогда вы действительно должны сделать isFixed() членом класса Object. Затем переопределите его в производном классе. Если вы делаете это таким образом, вам на самом деле не нужно хранить переменную fixed. Кроме того, вы должны изменить свой вектор на вектор указателей на Object s.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...