Что-то туплю с созданием декоратора. Нужно, чтобы работал сценарий, описанный в 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;
}