Пардон за кривую тему форума.
В общем проблема в следующем:
У меня есть базовый класс 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();
}
Извините за миллион кода.
Здравствуйте, 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 будет разрушен деструктором.
И кроме того нельзя объявлять массивы полиморфных указателей, так как у вас неправильно будет освобождена память при удалении массива.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.