在现场其他地方找不到解决方案,但是如果我错了,请指出其他地方。
说我想听一个按钮,然后根据单个对象的大小来做一些事情...
我将创建一个带有嵌套侦听器的按钮对象...
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编译器。
答案 0 :(得分:0)
您需要一个指针,因此获取对象的地址:
myButton.addListener(&mySingleton);
如果您有其他语言的背景知识,则需要阅读有关C ++中引用与值语义的更多信息。