История изменений
Исправление pozitiffcat, (текущая версия) :
где же это годный коммент? Ну представь что IF принимает foo(A *a), A = forward declaration. этот самый IF может конструировать IA, так как же мы IA передадим в метод foo?
// IA нихера не должен знать про детали типа hiddenMethod
struct IA{
virtual void setSomething(int i) = 0;
virtual ~IA() {}
}
struct IF{
virtual IA *makeA() const = 0;
virtual void drawA(IA *a) = 0;
virtual ~IF() {}
}
struct ConcreteA : public IA{
virtual void setSomething(int i) { ... }
void hiddenMethod(SomeHidden *sh) { ... }
}
struct ConcreteF : public IF{
ConcreteF() { m_sh = new SomeHidden(); }
virtual IA *makeA() const { return new ConcreteA(); }
virtual void drawA(IA *a) {
static_cast<ConcreteA*>(a)->hiddenMethod(m_sh);
// правильно избавится от static_cast
// юзер может определить свой наследованный от IA класс
// и попытаться запихать его в этот метод
}
SomeHidden *m_sh;
}
int main(){
IF *f = new ConcreteF();
IA *a = f->makeA();
a->setSomething(100500);
f->drawA(a);
delete a;
delete f;
return 0;
}
Исходная версия pozitiffcat, :
где же это годный коммент? Ну представь что IF принимает foo(A *a), A = forward declaration. этот самый IF может конструировать IA, так как же мы IA передадим в метод foo?
struct IA{
virtual void setSomething(int i) = 0;
virtual ~IA() {}
}
struct IF{
virtual IA *makeA() const = 0;
virtual void drawA(IA *a) = 0;
virtual ~IF() {}
}
struct ConcreteA : public IA{
virtual void setSomething(int i) { ... }
void hiddenMethod(SomeHidden *sh) { ... }
}
struct ConcreteF : public IF{
ConcreteF() { m_sh = new SomeHidden(); }
virtual IA *makeA() const { return new ConcreteA(); }
virtual void drawA(IA *a) {
static_cast<ConcreteA*>(a)->hiddenMethod(m_sh);
// правильно избавится от static_cast
// юзер может определить свой наследованный от IA класс
// и попытаться запихать его в этот метод
}
SomeHidden *m_sh;
}
int main(){
IF *f = new ConcreteF();
IA *a = f->makeA();
a->setSomething(100500);
f->drawA(a);
delete a;
delete f;
return 0;
}