首页 > 解决方案 > C++ 装饰器:从外部访问基类的公共函数

问题描述

我想尝试使用 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")));
    ...
}

我是否必须在 AbstractNPC 中将每个函数设为虚拟并将其从 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(); ???
}

标签: c++classdecorator

解决方案


这里的类NPC应该是一个具有所有虚函数的真实实现的具体类。它可以是最小的简单 NPC,其中实现是基本逻辑,如果根本没有应用装饰器,则应使用该逻辑。请注意,它甚至没有要重定向到的指针成员。

NPCDecorator应该具有将所有公共接口虚拟调用重定向到其npc指针成员的函数。

特定的装饰器喜欢Elite并且Shaman只需要定义它们改变行为的虚函数。如果Elite对做什么没有影响func2,它可以完全跳过声明和定义func2,因为它将从基类可见NPCDecorator

我肯定会更改所有指向此处的指针std::unique_ptr和所有new表达式std::make_unique,以避免编写手动清理代码和潜在的大量错误和令人头疼的问题。


推荐阅读