Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Множественное наследование и виртуальные функции  (Прочитано 33739 раз)
0 Пользователей и 1 Гость смотрят эту тему.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #30 : 03-11-2004 11:04 » 

Алик, сделай вызов с контекстом.

Например, перенеси те данные, которые ты сейчас хранишь в классе-обработчики, в класс перестановок.  

Другой вариант -- сделать явный контекст.  Например,

Код:
class Context {
   // Данные, необходимые для классов-обработчиков
};

class Processor {
public:
    virtual void new_context(); // создаёт свежий контекст
    virtual void userproc(T& target, Context& context); // Обрабатывает данные и обновляет контекст
};
Получается, что ты выделяешь состояние объекта в некоторый внешний к нему объект.  Тем самым снимается проблема доступа к состоянию.
« Последнее редактирование: 02-12-2007 17:16 от Алексей1153++ » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Алик
Постоялец

kz
Offline Offline

« Ответ #31 : 03-11-2004 11:15 » 

Ладно, господа, спасибо за консультацию.  :l_cool:
Все приму к сведению.
Записан
Алик
Постоялец

kz
Offline Offline

« Ответ #32 : 03-11-2004 11:18 » 

Цитата: npak
Алик, сделай вызов с контекстом.

Например, перенеси те данные, которые ты сейчас хранишь в классе-обработчики, в класс перестановок.  

Другой вариант -- сделать явный контекст.  Например,

Код:
class Context {
   // Данные, необходимые для классов-обработчиков
};

class Processor {
public:
    virtual void new_context(); // создаёт свежий контекст
    virtual void userproc(T& target, Context& context); // Обрабатывает данные и обновляет контекст
};
Получается, что ты выделяешь состояние объекта в некоторый внешний к нему объект.  Тем самым снимается проблема доступа к состоянию.

Тоже вариант. Но, ведь, в общем случае базовые классы ничего не знают о классе-потомке и, следовательно, у виртуальных функция нет параметра-контекста.
« Последнее редактирование: 02-12-2007 17:17 от Алексей1153++ » Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #33 : 03-11-2004 11:25 » 

Цитата: Алик

Тоже вариант. Но, ведь, в общем случае базовые классы ничего не знают о классе-потомке и, следовательно, у виртуальных функция нет параметра-контекста.

Дык, об том и речь.  Надо изменить интерфейс базового класса.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
pilpilon
Гость
« Ответ #34 : 30-12-2004 10:52 » 

#include <iostream>

using namespace std;
class A
{
 public :
 A(int i):n(i){}
 virtual ~A(){}
 void execproc()
  {
     execproc_A();
  }
protected :
 virtual void execproc_A()
   {
          cout << "A own execproc " <<n << endl;
   }
   protected :
      int n;
};

class B
{
public :
   B(int i):n(i){}
    virtual ~B(){}
void execproc()
  {
     execproc_B();
  }
protected :
 virtual void execproc_B()
   {
    cout << "B own execproc " <<n << endl;
   }
protected :
      int n;
};

class AB : public A, public B
{
  public:
     AB(int i):n(i),A(i*i),B(i*i*i){}
  virtual ~AB(){}
   void execproc()
   {
     cout << "AB own execproc " <<n << endl;
   }
  protected :
  virtual void execproc_A()
   {
     cout << "AB execproc for A baseclass " << n <<"\t"<< A::n<< endl;
   }
  virtual void execproc_B()
   {
   cout << "AB execprooc for B base class "  <<n <<"\t" << B::n << endl;
   }

private :
      int n;
};


int main(int argc, char *argv[])
{
    AB ab(3);
   A* p_a = &ab;
   B* p_b = &ab;
   A a = *p_a;
   B b = *p_b;

   ab.execproc();// out:  AB own execproc 3

   a.execproc();//   out:  A own execproc 9

   b.execproc();//   out:  B own execproc 27

   p_a->execproc();//   out:  AB execproc for A baseclass 3 9
 
   p_b->execproc();//   out:  AB execproc for B baseclass 3 27

   ab.A::execproc();//   out:  same as p_a->execproc();
   ab.B::execproc();//   out:  same as p_b->execproc();
   return 0;
}

Записан
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines