没有从Singleton到嵌套侦听器的可行转换*

时间:2018-07-21 12:27:14

标签: c++ inheritance singleton listener

在现场其他地方找不到解决方案,但是如果我错了,请指出其他地方。

说我想听一个按钮,然后根据单个对象的大小来做一些事情...

我将创建一个带有嵌套侦听器的按钮对象...

class ScaledButton
{
public:
    ScaledButton(const int buttonSize) : _buttonSize(buttonSize){}

    ~ScaledButton(){}

    /** Nested Listener calss*/
    class Listener
    {
    public:
        virtual ~Listener() {}

        /** Would be called on button click for example... */
        virtual void scaledButtonChanged(const int buttonSize) = 0;
    };

    void addListener (Listener* listener)
    {
        _listener = listener;
    }

private:
    ScaledButton();
    int _buttonSize;
    Listener* _listener; ///< POINTER TO THE LISTENER
};

然后创建我的单例,该单例从侦听器公开继承...

class Singleton : public ScaledButton::Listener ///< PUBLIC INHERITANCE HERE
{
public:
    static Singleton& getInstance()
    {
        static Singleton instance;
        return instance;
    }

    virtual void scaledButtonChanged(const int buttonSize) override
    {
        //... do something depending on the size of the button!!!!!!
    }

private:
    Singleton(){} // Must call get instance.
    Singleton(const Singleton&); // Cannot copy
    void operator= (const Singleton& args); // Cannot copy
};

然后在main中像这样添加侦听器。

int main()
{
    Singleton& mySingleton = Singleton::getInstance();

    ScaledButton myButton(5);
    myButton.addListener(mySingleton); ///< ERROR HERE!

    return 0;
}

但是无法添加以下错误的侦听器:

*从'Singleton'到'ScaledButton :: Listener '

没有可行的转换

我的直觉是与使用具有引用的单例和具有指针的Listener的冲突有关:或者是纯虚拟Listener类的继承。

尽管尝试各种单例实现(例如,使用全局ptr),但我的C ++技能不足以解决错误。有什么建议么?

在Mac OS上使用clang编译器。

1 个答案:

答案 0 :(得分:0)

您需要一个指针,因此获取对象的地址:

myButton.addListener(&mySingleton); 

如果您有其他语言的背景知识,则需要阅读有关C ++中引用与值语义的更多信息。