LINUX.ORG.RU

История изменений

Исправление 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;
}