Использование метода через массив указателей на родит. класс
От: tsevmenko  
Дата: 16.02.12 16:45
Оценка:
Пардон за кривую тему форума.
В общем проблема в следующем:
У меня есть базовый класс room, от него наследуются классы game_room, bad_room и dinning_room.
Мне необходимо внести данные о размерах каждой комнаты и вывести их при условии, что имеется еще один класс Building,
который включает в себя массив указателей родительского типа на наследуемые классы.
В классе Building имеется метод вывода всех данный на экран, вот как раз с ним проблема. Результатом являются данные неинициализированные.
Подскажите как решить такую проблему?

class room
{
public:
    char name;
    int square;
    int amount_people;

    room()
    {
        name = '-';
        square = 1000;
        amount_people = 1111;
    }
    virtual void set_data(char n, int s)=0;
    void View()
    {
        cout<<"Name: "<<this->name<<"."<<endl;
        cout<<"Square: "<<this->square<<"."<<endl;
        cout<<"People: "<<this->amount_people<<"."<<endl;
    }
    virtual~room(){}
};
class dinning_room:public room
{
public:
    dinning_room():room()
    {}
    void set_data(char n, int s)
    {
        name = n;
        square = s;
        amount_people = square;
    }
};
class Building
{
public:
    int amount_of_structure;
    int amount_of_rooms;
    int amount_of_floors;
    room* a[100];

    Building(int s, int r, int f)
    {
        amount_of_structure = s;
        amount_of_rooms = r;
        amount_of_floors = f;
    }
    void set(char ch, int square, int i)
    {
        switch(ch)
        {
            case 'd': 
            {
                dinning_room obj;
                this->a[i] = &obj;
                break;
            }
        //И далее все виды комнат
                }
        }
void View()
    {
        for(int i =0; i < amount_of_rooms; i++)
            a[i]->View();
    }

Извините за миллион кода.
Re: Использование метода через массив указателей на родит. к
От: Сыроежка  
Дата: 16.02.12 16:55
Оценка:
Здравствуйте, tsevmenko, Вы писали:

T>Пардон за кривую тему форума.

T>В общем проблема в следующем:
T>У меня есть базовый класс room, от него наследуются классы game_room, bad_room и dinning_room.
T>Мне необходимо внести данные о размерах каждой комнаты и вывести их при условии, что имеется еще один класс Building,
T>который включает в себя массив указателей родительского типа на наследуемые классы.
T>В классе Building имеется метод вывода всех данный на экран, вот как раз с ним проблема. Результатом являются данные неинициализированные.
T>Подскажите как решить такую проблему?

T>
T>class room
T>{
T>public:
T>    char name;
T>    int square;
T>    int amount_people;

T>    room()
T>    {
T>        name = '-';
T>        square = 1000;
T>        amount_people = 1111;
T>    }
T>    virtual void set_data(char n, int s)=0;
T>    void View()
T>    {
T>        cout<<"Name: "<<this->name<<"."<<endl;
T>        cout<<"Square: "<<this->square<<"."<<endl;
T>        cout<<"People: "<<this->amount_people<<"."<<endl;
T>    }
T>    virtual~room(){}
T>};
T>class dinning_room:public room
T>{
T>public:
T>    dinning_room():room()
T>    {}
T>    void set_data(char n, int s)
T>    {
T>        name = n;
T>        square = s;
T>        amount_people = square;
T>    }
T>};
T>class Building
T>{
T>public:
T>    int amount_of_structure;
T>    int amount_of_rooms;
T>    int amount_of_floors;
T>    room* a[100];

T>    Building(int s, int r, int f)
T>    {
T>        amount_of_structure = s;
T>        amount_of_rooms = r;
T>        amount_of_floors = f;
T>    }
T>    void set(char ch, int square, int i)
T>    {
T>        switch(ch)
T>        {
T>            case 'd': 
T>            {
T>                dinning_room obj;
                this->>a[i] = &obj;
T>                break;
T>            }
T>        //И далее все виды комнат
T>                }
T>        }
T>void View()
T>    {
T>        for(int i =0; i < amount_of_rooms; i++)
T>            a[i]->View();
T>    }

T>Извините за миллион кода.
T>



Вы присваиваете указателю адрес локального объекта, который удаляется при выходе его из блока кода

case 'd':
{
dinning_room obj;
this->>a[i] = &obj;
break;
}

То есть как только этот case завершится, объект obj будет разрушен деструктором.

И кроме того нельзя объявлять массивы полиморфных указателей, так как у вас неправильно будет освобождена память при удалении массива.
Меня можно встретить на www.cpp.forum24.ru
Re[2]: Использование метода через массив указателей на родит
От: Ops Россия  
Дата: 18.02.12 17:55
Оценка: -1
Здравствуйте, Сыроежка, Вы писали:

С>И кроме того нельзя объявлять массивы полиморфных указателей, так как у вас неправильно будет освобождена память при удалении массива.


А вот тут могут быть варианты. Синглтон Майерса не подразумевает удаления. remark тоже не удалял. Если время жизни объекта == времени жизни программы, то удалять его не обязательно.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.