C++ 如何访问decorator类的方法?

C++ 如何访问decorator类的方法?,c++,decorator,C++,Decorator,我有下面的程序实现了一个基本的decorator类,但是decorator也有自己的成员函数,我希望可以访问这些函数。在下面的例子中,我想做一些类似finalMouse->rightMouseButton->click()的事情。这种类型的交互甚至可以与装饰师进行,还是另一种设计模式?我在想可能是战略,但这似乎不适用 谢谢 #include <string> #include <iostream> using namespace std; typedef enum _

我有下面的程序实现了一个基本的decorator类,但是decorator也有自己的成员函数,我希望可以访问这些函数。在下面的例子中,我想做一些类似finalMouse->rightMouseButton->click()的事情。这种类型的交互甚至可以与装饰师进行,还是另一种设计模式?我在想可能是战略,但这似乎不适用

谢谢

#include <string>
#include <iostream>

using namespace std;

typedef enum _location { TOP, SIDE } location;
typedef enum _direction { FORWARD, BACKWARD } direction;

class MouseAbstract
{
    public:
        virtual string printConfiguration() = 0;
};

class Mouse : public MouseAbstract
{
    public:
        Mouse(string n) { name = n; };
        string printConfiguration() {
            return name + " Configuration: ";
        }
    private:
        string name;
};

class MouseConfigurationAddon : public MouseAbstract
{
    public:
        MouseConfigurationAddon(MouseAbstract* add, location loc, string desc) {
            addon = add;
            mLocation = loc;
            description = desc;
        };
        string printConfiguration() {
            string outLoc = (mLocation == TOP) ? "Location: Top" : "Location: Side";
            return addon->printConfiguration() + "\n\nAddon: " + description + ", " + outLoc;
        }
    protected:
        MouseAbstract* addon;
        location mLocation;
        string description;
};

class Button : public MouseConfigurationAddon
{
    public:
        Button(MouseAbstract* add, location loc, string desc) : MouseConfigurationAddon(add, loc, desc) {};
        string click() {
            return description + " has been clicked.";
        };
};

class ScrollWheel : public MouseConfigurationAddon
{
public:
    ScrollWheel(MouseAbstract* add, location loc, string desc) : MouseConfigurationAddon(add, loc, desc) {};
    string spin(direction dir, double rotations) {
        string outDir = (mLocation == FORWARD) ? "forward" : "backward";
        return description + " has been spun " + outDir + to_string(rotations) + " rotations.";
    };
};

int main() {
    Mouse* baseMouse = new Mouse("My Gaming Mouse");
    Button* rightMouseButton = new Button(baseMouse, TOP, "Right Mouse Button");
    Button* leftMouseButton = new Button(rightMouseButton, TOP, "Left Mouse Button");
    Button* sideButton1 = new Button(leftMouseButton, SIDE, "Side Button 1");
    Button* sideButton2 = new Button(sideButton1, SIDE, "Side Button 2");
    ScrollWheel* finalMouse = new ScrollWheel(sideButton2, TOP, "Scroll Wheel");

    cout << finalMouse->printConfiguration() << endl;

    delete finalMouse;
    return 0;
}
#包括
#包括
使用名称空间std;
typedef枚举_位置{TOP,SIDE}位置;
typedef枚举_方向{向前,向后}方向;
类MouseAbstract
{
公众:
虚拟字符串printConfiguration()=0;
};
鼠标类:public MouseAbstract
{
公众:
鼠标(字符串n){name=n;};
字符串printConfiguration(){
返回名称+“配置:”;
}
私人:
字符串名;
};
类MouseConfigurationAddon:PublicMouseAbstract
{
公众:
MouseConfigurationAddon(MouseAbstract*添加、位置定位、字符串描述){
addon=add;
mLocation=loc;
描述=描述;
};
字符串printConfiguration(){
字符串outLoc=(位置==顶部)?“位置:顶部”:“位置:侧面”;
返回加载项->打印配置()+“\n\n加载项:“+description+”,“+outLoc;
}
受保护的:
MouseAbstract*插件;
位置;
字符串描述;
};
类按钮:公共鼠标配置加载项
{
公众:
按钮(MouseAbstract*add,location loc,string desc):MouseConfigurationAddon(add,loc,desc){};
字符串单击(){
已单击“返回说明+”;
};
};
类滚轮:公共鼠标配置加载项
{
公众:
滚轮(MouseAbstract*add,location loc,string desc):MouseConfigurationAddon(add,loc,desc){};
弦旋转(方向定向,双旋转){
字符串outDir=(MLLOCATION==FORWARD)?“FORWARD”:“backward”;
返回说明+“已旋转”+outDir+到字符串(旋转)+“旋转”;
};
};
int main(){
鼠标*baseMouse=新鼠标(“我的游戏鼠标”);
按钮*rightMouseButton=新按钮(底部鼠标,顶部,“鼠标右键”);
按钮*左鼠标按钮=新按钮(右鼠标按钮,顶部,“左鼠标按钮”);
按钮*sideButton1=新按钮(左侧鼠标按钮,侧面,“侧面按钮1”);
按钮*侧按钮2=新按钮(侧按钮1,侧,“侧按钮2”);
ScrollWheel*finalMouse=新的滚轮(侧按钮2,顶部,“滚轮”);

cout printConfiguration()没有设计模式将生成
finalMouse->rightMouseButton->click()工作,至少如果你不做<代码> RouthMousButo> <代码> > < Scrollwheel > /Cux>类的成员。基于你实例化的装饰器动态添加数据成员将需要运行时的反映,但是C++甚至没有编译时的反映。如果你不需要在运行时创建配置您可能会得到与使用CRTP类似的结果。无论如何,只调用
rightMouseButton->click()
有什么不对?毕竟您已经有了
rightMouseButton
变量。这不是Java。不要像那样使用裸
new
。这是一种糟糕的做法。编写
Mouse baseMouse{“我的游戏鼠标”}
auto-baseMouse=Mouse{“我的游戏鼠标”}
感谢@Corristo的评论。我学到了一些有趣的东西,你证实了我最初的想法。调用rightMouseButton->click()没有错但从语义上讲,出于可读性的目的,将其称为层次结构的一部分是很好的,但既然不能这样做,那么这将很好地工作