我想创建一个成员回调变量而不是可以接受多个参数:
class Polygon : public Shape {
protected:
void (*onClick)( Polygon * );
void (*onClick)( Point * );
void (*onClick)();
...
}
当然这段代码会抛出错误。有什么特别的理由说明我不能或不应该这样做吗?还有替代品吗?对于相同的行为,我不想要三个不同的名字。
答案 0 :(得分:4)
Tl;博士:因为标准不允许你这样做。
使用"同名的不同行为"
,只能在函数指针过载的情况下使用函数重载(或在某种程度上使用模板)。为了保持onClick
的相同名称,您必须求助于重载:
#include <functional>
class Polygon : public Shape {
private:
std::function<void(Polygon*)> _poly_f;
std::function<void(Point*)> _point_f;
std::function<void()> _empty_f;
protected:
void onClick(Polygon* p) { _poly_f(p); }
void onClick(Point* p) { _point_f(p); }
void onClick() { _empty_f(); }
...
}
答案 1 :(得分:1)
您在这里声明变量。两个变量不能有相同的名称。