C++是一个有自己方法的对象?

cor*_*izz 2 c++ oop

对不起,这可能是一个愚蠢的问题.我显然误解了面向对象编程的基本原理.我习惯了C,现在正在尝试使用C++.

我在一个名为Button的类中有一些按钮.每个按钮都有不同的功能.我想要写的是这样的:

Button button1;
Button button2;
...
void button1::onClick () {
    ...
}
void button2::onClick () {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用("按钮1不是类,命名空间或枚举" - 是的,我知道!).我知道我可以为每个按钮创建一个单独的类:

class button1_class : public Button {
public:
     void onclick () {
        ...
     }
} button1;
class button2_class : public Button {
     ...
}
Run Code Online (Sandbox Code Playgroud)

但对我来说,当我知道它只会有一个成员时,上课是"错误的".

我正在使用Agui,Allegro 5的GUI库.

编辑

谢谢你的回复.虽然它们都是有用的(我认为)所有有效的答案,但是没有人真正说过"没有你不能用自己独特的方法拥有一个对象,因为......"

因此,例如,如果object1的类型为ObjectClass,则不允许object1具有object1唯一的方法(成员函数),而是拥有作为ObjectClass的一部分定义的方法.是对的吗?对不起,我没有包括我的实际用例.我更感兴趣的是只是让我的头围绕OOP,这样我就可以自己正确地做到这一点.

EDIT2更详细地查看响应,我认为使用lambda表达式是可能的,它只是不像我想象的那样.再次感谢

Chr*_*phe 7

自然的C++方式就像vsoftco解释的那样,具有虚拟和继承.

但是,如果您的Button类已经拥有所需的所有内容,并且按钮之间唯一的变化是要执行的唯一(trhow-away)操作,您可能需要考虑以下替代方法:

class Button {
    function<void()>  f; 
public: 
    Button(function<void()> mf) : f(mf) {}
    void onClick() { f();  }
};
Run Code Online (Sandbox Code Playgroud)

您的类的这个变体使用一个function对象(将其视为一种函数指针,但使用起来更灵活).

然后,您可以将其与lambda函数一起使用,如下例所示:

int main(int ac, char**av) 
{
    Button button1([&]() { cout << "Hello 1!\n"; });
    Button button2 ([]() { cout << "Hello 2!\n"; });

    button1.onClick();
    button2.onClick();
}
Run Code Online (Sandbox Code Playgroud)