C ++ декоратор: доступ к функции publi c базового класса извне - PullRequest
0 голосов
/ 30 марта 2020

Я хочу попробовать использовать декораторы C ++, и у меня есть несколько вопросов.

Используя этот пример: https://gist.github.com/dlivingstone/3006324#file -decoratormain- cpp

class AbstractNPC {
public:
    virtual void render() = 0;
};

class NPC: public AbstractNPC {
public:
    NPC() { }
    render(){...}
};

class NPCDecorator: public AbstractNPC {
private:
    AbstractNPC * npc;
public:
    NPCDecorator(AbstractNPC *n) { npc = n; }
    void render() { npc->render(); } // delegate render to npc data member
};

class Elite: public NPCDecorator {
public:
    Elite(AbstractNPC *n): NPCDecorator(n) { }
    void render() {
        cout << "Elite "; // render special features
        NPCDecorator::render(); // delegate to base class
    }
};

int main(){
    AbstractNPC *goblin1= new Elite(new Shaman(new NPC("Goblin")));
    ...
}

Должен ли я сделать каждую функцию виртуальной в AbstractNP C и перенаправить ее из NPCDecorator для вызова ее извне?

class NPC: public AbstractNPC {
public:
    NPC();
    void render() {...}
    void func1() {...}
    void func2() {...}
    void func3() {...}
    void func4() {...}
    void func5() {...}
};
int main(){
    AbstractNPC *goblin1= new Elite(new Shaman(new NPC("Goblin")));
    call func1(); ???
}

1 Ответ

2 голосов
/ 30 марта 2020

Класс NPC здесь должен быть конкретный класс с реальными реализациями всех виртуальных функций. Это может быть минимальный простой NP C, где реализации - это основы c logi c, которые следует использовать, если декораторы вообще не применяются. Обратите внимание, что у него даже нет члена-указателя для перенаправления.

Класс NPCDecorator должен иметь функции, перенаправляющие все виртуальные вызовы интерфейса publi c на его npc член-указатель.

Декораторам c, таким как Elite и Shaman, нужно только определять виртуальные функции, в которых они изменяют поведение. Если Elite не влияет на то, что делает func2, он может полностью пропустить объявление и определение func2, так как это будет видно из базового класса NPCDecorator.

. Я определенно изменил бы все указатели на std::unique_ptr и все new выражения для std::make_unique здесь, чтобы избежать написания кода ручной очистки и возможности появления множества ошибок и головной боли.

...