Дать немного коментария по коду

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

prikolist
Сообщения: 38
Зарегистрирован: 19 ноя 2008, 13:09

Здравсвуйте программисты! Дайте пожалуйста коментарий, желательно подробнее,что делается в этом коде, и правильно ли он написан, согласно вот этому условию. Также должен быть вывод результата в нём,так сказал мне преподаватель.

Код: Выделить всё

Создать класс комната, имеющий площадь, определенное число комнат, этаж. Определить конструктор, деструктор и методы доступа( чтения и записи) полей класса. 
Создать два производных класса:
1)	Класс - однокомнатная квартира, содержащий комнату и кухню (ее площадь).
2)	Класс – трехкомнатная квартира, содержащий 3 комнаты (их площади), кухню (ее площадь).
Определить конструкторы, деструкторы, методы доступа(чтения и записи) площади, этажности, количества комнат однокомнатной и трехкомнатной квартиры. 
Создать экземпляры объектов всех классов.
В методах доступа к данным класса предусмотреть вывод сообщений поясняющих, метод какого класса вызывается
Вот код, ниже, дайте пожалуйста ему максимальное пояснение,так как очень нужно, это нужно будет мне обяснить преподавателю, просто не всё здесь мне ясно,что делается.Заранне благодарен за ответ.

Код: Выделить всё

#include <vcl.h>
#include <iostream.h>
#include <conio.h>
using namespace std;

class Room
{
protected:
double square;     //Площадь
int count_room;   //Количество комнат
int floor;       //Этаж


public:
Room(): square(0), count_room(0), floor(0) {}
Room(double sqr, int count, int flr): square(sqr), count_room(count), floor(flr) {}
~Room() {}

void SetRoomCount(int count) { count_room = count; }
void SetRoomSquare(double sqr) { square = sqr; }
void SetRoomFloor(int flr) { floor = flr; }

int GetRoomCount()const { return count_room; }
double GetRoomSquare()const { return square; }
int GetRoomFloor()const { return floor; }
};

class OneRoom: public Room
{
private:
double square_kitchen;

public:
OneRoom(): square_kitchen(0) { Room(); count_room = 1; }
OneRoom(double sqr, int flr, double sqr_kitchen) { Room(sqr, 1, flr); square_kitchen = sqr_kitchen; }

void SetRoomCount()const {}
void SetKitchenSquare(double sqr) { square_kitchen = sqr;  }
double GetKitchenSquare()const { return square_kitchen; }
};


class ThreeRoom: public OneRoom
{
public:
ThreeRoom() { OneRoom(); count_room = 3; }
ThreeRoom(double sqr, int flr, double sqr_kitchen) { OneRoom(sqr, flr, sqr_kitchen); }
};


main()
{
getch();
}

Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Начнём с того, что деструкор в Room должен быть виртальным, т.к. от него наследуют.
В классе Room первые 3 члена защищённые - это значит (упрощённо), что к ним нельзя иметь доступ нигде, кроме самого класса и его потомков. Далее следуют публичные конструктор, конструктор с параметрами и деструктор. Все inline. Нет, кстати, операции присваивания.
Что конкретно неясно в этом коде ?
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
prikolist
Сообщения: 38
Зарегистрирован: 19 ноя 2008, 13:09

Дайте пожалуйста подробнее объяснение по последним 2 классам,именно по вот этому куску,желательно максимальнее подробно. Просто у меня будут спрашивать.

Код: Выделить всё

class OneRoom: public Room
{
private:
double square_kitchen;

public:
OneRoom(): square_kitchen(0) { Room(); count_room = 1; }
OneRoom(double sqr, int flr, double sqr_kitchen) { Room(sqr, 1, flr); square_kitchen = sqr_kitchen; }

void SetRoomCount()const {}
void SetKitchenSquare(double sqr) { square_kitchen = sqr;  }
double GetKitchenSquare()const { return square_kitchen; }
};


class ThreeRoom: public OneRoom
{
public:
ThreeRoom() { OneRoom(); count_room = 3; }
ThreeRoom(double sqr, int flr, double sqr_kitchen) { OneRoom(sqr, flr, sqr_kitchen); }
};

Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Класс OneRoom унаследован публично (это упрощённо значит, что какой доступ был, такой и остался) от Room. Добавили закрытый (это упрощённо значит, что к нему доступ возможен только из класса, где он определён, исключая "друзей") член square_kitchen. Далее следуют публичные конструкторы и 3 функции. Все inline.Класс ThreeRoom аналогичен, только наследуется почему-то от OneRoom (это не совсем верно, т.к. у OneRoom нет виртуального деструктора) и нет функций. Они унаследуются от OneRoom. Нигде нет определения операции присваивания.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
prikolist
Сообщения: 38
Зарегистрирован: 19 ноя 2008, 13:09

Зачем в классе class ThreeRoom,после слова public: пишется OneRoom() , а затем ниже в конструкторе ThreeRoom(double sqr, int flr, double sqr_kitchen) опять пишется OneRoom(sqr, flr, sqr_kitchen) { count_room=3;} и парметры у них одинаковые?
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

В первом случае это публичное наследование, а во втором - вызов конструктора без параметров.
Сори сразу не увидел, что в конструкторе с параметрами оно тоже есть. Это не меняет сути - во второом случае - это вызов коструктора, но уже с параметрами.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
prikolist
Сообщения: 38
Зарегистрирован: 19 ноя 2008, 13:09

Код: Выделить всё

class ThreeRoom: public OneRoom
{
public:
ThreeRoom() { OneRoom(); count_room = 3; }
ThreeRoom(double sqr, int flr, double sqr_kitchen) { OneRoom(sqr, flr, sqr_kitchen); }
};
В первой строке { OneRoom(); count_room = 3; } -OneRoom(); - это наследование от класса OneRoom чего?
А во 2-ой строке,что именно происходит: ThreeRoom(double sqr, int flr, double sqr_kitchen) { OneRoom(sqr, flr, sqr_kitchen); }
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Первая строка - это вообще-то "class ThreeRoom: public OneRoom"
А в строке "ThreeRoom(double sqr, int flr, double sqr_kitchen) { OneRoom(sqr, flr, sqr_kitchen);" происходит определение конструктора с параметрами, потом они передаются в конструктор родительского класса. Тоже с параметрами. Т.к. тело конструктора присутствует при объявлении класса, то он inline.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Код: Выделить всё

ThreeRoom(double sqr, int flr, double sqr_kitchen) { OneRoom(sqr, flr, sqr_kitchen); }
В этой строке в теле конструктора TreeRoom создаётся temorary объект типа OneRoom, в конструктор которого скармливаются параметры, пришедшие в конструктор TreeRoom. После закрывающей скобки временный объект умирает, а поля TreeRoom так и остаются инициализированными дефолтными значениями, а не теме значениями, которые мы передали хотели в них проставить.

Подозреваю, что автор хотел вызвать конструктор базового класса для this, а не для временного объекта. Правильно это делается так:

Код: Выделить всё

ThreeRoom(double sqr, int flr, double sqr_kitchen) : OneRoom(sqr, flr, sqr_kitchen) {}
То же самое касается конструктора по умолчанию.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
prikolist
Сообщения: 38
Зарегистрирован: 19 ноя 2008, 13:09

Я напишу,как я понял.Если что,поправьте пожалуйста. Строка:

Код: Выделить всё

 class ThreeRoom: public OneRoom 
- Это значит,что класс ThreeRoom,является наследником класса OneRoom.
Строка

Код: Выделить всё

 ThreeRoom() { OneRoom(); count_room = 3; }
-
говорит о том.что в классе ThreeRoom, вызывается класс OneRoom();(только не понятно зачем) а count_room = 3; - это присвоение полю count_room находящегося в разделе protected класса Room - число 3

Строка

Код: Выделить всё

 ThreeRoom(double sqr, int flr, double sqr_kitchen) { OneRoom(sqr, flr, sqr_kitchen); }
говорит о том,что создаётся конструктор ThreeRoom(тоесть 3-хкомнатная квартира) с 3 парметрами(double sqr, int flr, double sqr_kitchen) - унаследованными от главного классса Room, , а строка

Код: Выделить всё

 OneRoom(sqr, flr, sqr_kitchen)
- зачем вызывается внутри конструктора ThreeRomm не понятно
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Для чего вот этот конструктор { OneRoom(sqr, flr, sqr_kitchen); }, находится в этой строке

Код: Выделить всё

ThreeRoom(double sqr, int flr, double sqr_kitchen) : OneRoom(sqr, flr, sqr_kitchen) { count_room=3;}
Что, в что записывается в данной строке?
Ответить