Russian Qt Forum
Май 17, 2024, 22:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Декоратор и доступ к полям класса  (Прочитано 3910 раз)
billygates
Гость
« : Январь 27, 2010, 14:12 »

Что-то туплю с созданием декоратора. Нужно, чтобы работал сценарий, описанный в main(). Ошибка, выдаваемая gcc -- очевидна и вполне логична (за исключением того, что friend не срабатывает). Как достичь желаемого? Спасибо.

P.S. Одно из условий, нужно, чтобы Base не знал о своих дочерних классах.

Код:
decorator.cxx: In member function ‘virtual void DecoratedBase::doSomething()’:
decorator.cxx:12: error: ‘int Base::dataA_’ is protected
decorator.cxx:47: error: within this context
decorator.cxx:13: error: ‘char Base::dataB_’ is protected
decorator.cxx:48: error: within this context

Код
C
#include <iostream>
 
// Abstract Decorator class
struct Decorator
{
};
 
class Base
{
   protected:
       int dataA_;
       char dataB_;
   public:
       Base()
       {
           dataA_ = 10;
           dataB_ = 'r';
       }
 
       virtual void doSomething()
       {
           dataA_ *= 2;
           dataB_++;
       }
 
       virtual void printOut()
       {
           std::cerr << dataA_ << std::endl;
           std::cerr << dataB_ << std::endl;
       }
 
       friend class Decorator;
};
 
class DecoratedBase : public Decorator, public Base
{
   private:
       Base* base_;
   public:
       DecoratedBase(Base* base) : base_(base)
       {
       }
 
       virtual void doSomething()
       {
           base_->dataA_ *= 3;
           base_->dataB_ = 'n';
       }
};
 
 
 
int main(int argc, char** argv)
{
   Base* b = new Base;
 
   DecoratedBase d(b);
   d.doSomething();
   d.printOut();
 
   delete b;
 
   return 0;
}
 
Записан
Barmaglodd
Гость
« Ответ #1 : Январь 27, 2010, 14:48 »

Вроде friend не наследуется. Сейчас у Страуструпа спрошу.
Записан
Barmaglodd
Гость
« Ответ #2 : Январь 27, 2010, 14:50 »

Бъерн говорит : "Дружба не наследуется и не транзитивна.".
Записан
ildar
Гость
« Ответ #3 : Январь 27, 2010, 15:17 »

тем не менее, Decorator будет иметь доступ к наследникам Base

но в первоначальном примере это не поможет

имхо идея декоратора используется не правильно

Записан
billygates
Гость
« Ответ #4 : Январь 27, 2010, 15:21 »

Цитировать
Бъерн говорит : "Дружба не наследуется и не транзитивна.".
да-да, все верно.

но в первоначальном примере это не поможет

имхо идея декоратора используется не правильно
не уточните, пожалуйста, что здесь неправильно? Подозреваю неправильно, что меняю значения полей -- в настоящем сценарии, мне их менять не надо, просто надо изменить поведение функции doSomething(), при этом имея доступ на чтение к полям Base. И вопрос, увы, все еще актуален.
Записан
ildar
Гость
« Ответ #5 : Январь 27, 2010, 15:53 »

вроде как идея состоит в том, что все объекты цепочки декораторов должны иметь одинаковый интерфейс, т.к. в общем случае каждый из этих объектов не знает кого он декорирует и кем будет декорирован.
имхо нужно объявить интерфейс для доступа к интересующим данным вместо дружбы.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.059 секунд. Запросов: 21.