![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 11.06.2010
Сообщений: 5
|
![]()
Разбираю паттерн "команда". Нашел пример на С++ на http://sourcemaking.com/design_patterns/command/cpp/2
Но выдает ошибки при компиляции. Если код разнести по файлам то остается только 2 ошибки. error C2027: use of undefined type 'Person' error C2059: syntax error : '*' Проблема вроде в перекрестной композиции. Но у них же как-то работало Код HTML:
#include <iostream> #include <string> using namespace std; class Person; class Command { // 1. Create a class that encapsulates an object and a member function // a pointer to a member function (the attribute's name is "method") Person *object; // void(Person:: *method)(); public: Command(Person *obj = 0, void(Person:: *meth)() = 0) { object = obj; // the argument's name is "meth" method = meth; } void execute() { (object-> *method)(); // invoke the method on the object } }; class Person { string name; // cmd is a "black box", it is a method invocation // promoted to "full object status" Command cmd; public: Person(string n, Command c): cmd(c) { name = n; } void talk() { // "this" is the sender, cmd has the receiver cout << name << " is talking" << endl; cmd.execute(); // ask the "black box" to callback the receiver } void passOn() { cout << name << " is passing on" << endl; // 4. When the sender is ready to callback to the receiver, // it calls execute() cmd.execute(); } void gossip() { cout << name << " is gossiping" << endl; cmd.execute(); } void listen() { cout << name << " is listening" << endl; } }; int main() { // Fred will "execute" Barney which will result in a call to passOn() // Barney will "execute" Betty which will result in a call to gossip() // Betty will "execute" Wilma which will result in a call to listen() Person wilma("Wilma", Command()); // 2. Instantiate an object for each "callback" // 3. Pass each object to its future "sender" Person betty("Betty", Command(&wilma, &Person::listen)); Person barney("Barney", Command(&betty, &Person::gossip)); Person fred("Fred", Command(&barney, &Person::passOn)); fred.talk(); } |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 01.07.2011
Сообщений: 423
|
![]()
В таких случаях на будущее я вам советую указывать, какие ошибки выдает компилятор и в какой строке.
Лично я не понимаю следующее объявление. Причем здесь Person? Скорей всего у вас ругается именно на этой строке. void(Person:: *method)(); У вас тип Person не законченный, поэтому всякие ссылки на его члены будут генерировать ошибку.
Со мной можно встретиться на www.clipper.borda.ru
Последний раз редактировалось Сыроежка; 21.07.2011 в 20:40. |
![]() |
![]() |
![]() |
#3 |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
![]()
Сыроежка
вроде бы это предварительно объявление. класс person содержит поле cmd класса command. класс command содержит полье object класса person. Без предвариательного объявления тут не обойтись |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 31.01.2011
Сообщений: 160
|
![]()
надо нормально интерфейсы классов расписать, а уже потом определения
ну и да, определение в разных *.h и *.cpp тоже не дураки придумали |
![]() |
![]() |
![]() |
#5 |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
![]()
если ТС скинет проект целиком, разбитый на файлы - то Мб посмотрю.
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Паттерн Service Layer (Сервисный уровень) | ВаликАматор | Общие вопросы C/C++ | 0 | 27.02.2011 11:37 |
паттерн singleton | zhenya.ya | Общие вопросы C/C++ | 1 | 26.11.2010 03:11 |
Паттерн MVP | Vistar | Общие вопросы .NET | 0 | 11.09.2010 18:45 |
Zadacha po izmeneniu command | Zmeiarm | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 1 | 22.12.2009 15:10 |