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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2011, 12:22   #1
mzelenyy
 
Регистрация: 11.06.2010
Сообщений: 5
По умолчанию Паттерн command. В чем ошибка?

Разбираю паттерн "команда". Нашел пример на С++ на 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();
}
mzelenyy вне форума Ответить с цитированием
Старый 21.07.2011, 20:02   #2
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

В таких случаях на будущее я вам советую указывать, какие ошибки выдает компилятор и в какой строке.

Лично я не понимаю следующее объявление. Причем здесь Person? Скорей всего у вас ругается именно на этой строке.

void(Person:: *method)();

У вас тип Person не законченный, поэтому всякие ссылки на его члены будут генерировать ошибку.
Со мной можно встретиться на www.clipper.borda.ru

Последний раз редактировалось Сыроежка; 21.07.2011 в 20:40.
Сыроежка вне форума Ответить с цитированием
Старый 24.07.2011, 14:00   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Сыроежка
вроде бы это предварительно объявление.
класс person содержит поле cmd класса command.
класс command содержит полье object класса person.
Без предвариательного объявления тут не обойтись
rrrFer вне форума Ответить с цитированием
Старый 24.07.2011, 14:07   #4
alex_x_x
Форумчанин
 
Регистрация: 31.01.2011
Сообщений: 160
По умолчанию

надо нормально интерфейсы классов расписать, а уже потом определения
ну и да, определение в разных *.h и *.cpp тоже не дураки придумали
alex_x_x вне форума Ответить с цитированием
Старый 24.07.2011, 14:08   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

если ТС скинет проект целиком, разбитый на файлы - то Мб посмотрю.
rrrFer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паттерн 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