Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2010, 15:22   #1
fantom_ZET
Пользователь
 
Регистрация: 28.01.2010
Сообщений: 17
По умолчанию Композиция класов

Делал я тут задание по книге Дейтла. Сделать модель лифта в 2 этажном офисе. Но вот наткнулся на проблему с композициями классов:
Приведу код на русском:

Код:
class CElevator {
public:
   CElevator();//по умолчанию создается на 1 этаже, с целью 1
   void move(); //движемся к цели
private:
   int position;
   int purpose;//куда нужно ехать (на какой этаж) - цель
};

class CPasenger {
public:
   CPasenger(CElevator &); //принимаем адрес CElevator elevator
private:
   int position;//этаж появления
   int purpose;//этаж - цель
   CElevator elevator;
};

void main() {
   CElevator elevator;
   CPasenger pasenger(elevator);
}
Проблема вот в чем.
По идее пассажир должен уметь воздействовать на поведение лифта. Для этого в классе пассажир и объявлен лифт. При создании нового пассажира в его конструктор поступает адрес лифта - адрес одного единственного неизменного лифта, на поведение которого пассажир может влиять.
Но. В моем коде ошибка. Пассажир просто напросто создает свой - новый лифт. Почему - я же сказал ему вот тебе адрес пользуйся им - и не создавай новый лифт.
Как сделать так чтобы пассажир принимал ссылку, или адрес уже существующего объекта класса лифт?

Последний раз редактировалось fantom_ZET; 31.10.2010 в 15:35.
fantom_ZET вне форума Ответить с цитированием
Старый 31.10.2010, 15:34   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Код:
class CPasenger {
public:
   CPasenger(CElevator &); //принимаем адрес CElevator elevator
private:
   int position;//этаж появления
   int purpose;//этаж - цель
   static CElevator elevator;
};
Так подойдет?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 31.10.2010, 15:42   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

А лучше просто
Код:
class CPasenger {
public:
   CPasenger(CElevator*); //принимаем адрес CElevator elevator
private:
   int position;//этаж появления
   int purpose;//этаж - цель
   CElevator* elevator;
};
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 31.10.2010, 16:14   #4
fantom_ZET
Пользователь
 
Регистрация: 28.01.2010
Сообщений: 17
По умолчанию

Syuf - все равно создается новый лифт - уже статический но новый. Получается пассажир создает лифт. А должно быть Пассажир знает где лифт, знает все свойства лифта.

Здесь у лифта есть статус который по умолчанию равен 0, создается новый пассажир, и пробует изменить статус лифта на другой. В итоге оказывается что он снова создал еще один объект класса Лифт и присвоил ему статус. А настоящий лифт так и остался с нулевым статусом.

Код:
class CElevator {
public:
	CElevator() {status = 0;}
	void print_status() const {printf("Status: %d\n", status); }
	void set_status(int nStatus) {status = nStatus;}
private:
	int status;

};

class CPasenger {
public:
	CPasenger(CElevator* elevator);
	void click(int status) {elevator->set_status(status);}//Нажал на кнопку - поменял статус лифта
private:
	CElevator* elevator;
};

void main() {
	CElevator elevator;
	elevator.print_status();
	CPasenger pasenger(&elevator);
}
(Код новый но смысл остался тот же...)
Что не так?? С этими указателями и ссылками одна морока.... Опять ошибку пишет:
unresolved external symbol "public: __thiscall CPasenger::CPasenger(class CElevator *)" (??0CPasenger@@QAE@PAVCElevator@@@Z )

Или подскажите как правильно инициализировать объект одного класса в качестве элимента другого класса, передачей по ссылке или через указатель.

Последний раз редактировалось fantom_ZET; 31.10.2010 в 16:39.
fantom_ZET вне форума Ответить с цитированием
Старый 31.10.2010, 16:38   #5
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Цитата:
unresolved external symbol
значит, что у вас функция/переменная/что-то еще объявлена и пытается использоваться, а определения нигде нет.
Конструктор-то могли бы и написать.
Код:
CPasenger(CElevator* elev): elevator(elev) {};
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 31.10.2010, 16:40   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
Что не так?? С этими указателями и ссылками одна морока.... Опять ошибку пишет:
Так вы напишите реализацию конструктора CPasenger::CPasenger.
Опоздал...
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 31.10.2010, 16:50   #7
fantom_ZET
Пользователь
 
Регистрация: 28.01.2010
Сообщений: 17
По умолчанию

Гром, Syuf спасибо. Все работает.
fantom_ZET вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Формирование изображения (редактирование, композиция) TIgor4 Мультимедиа в Delphi 2 28.02.2010 21:03
Классы С++ (Композиция) werser Помощь студентам 12 01.12.2009 18:55
Диаграма класов (Power Designer'ам) Gollandec Помощь студентам 0 29.11.2009 13:57