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

标签 c++ oop

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

我在一个名为 Button 的类中有一些按钮。每个按钮都有不同的作用。我写的是这样的:

Button button1;
Button button2;
...
void button1::onClick () {
    ...
}
void button2::onClick () {
    ...
}

但这不起作用(“按钮 1 不是类、 namespace 或枚举”——是的,我知道!)。我知道我可以为每个按钮创建一个单独的类:

class button1_class : public Button {
public:
     void onclick () {
        ...
     }
} button1;
class button2_class : public Button {
     ...
}

但对我来说,当我确定它只会有一个成员时,开设一个类(class)“感觉”不对。

我正在使用 Agui,这是一个适用于 Allegro 5 的 GUI 库。

编辑

感谢您的回复。虽然它们都很有帮助并且(我认为)都是有效的答案,但实际上还没有人说过“不,你不能拥有一个具有自己独特方法的对象,因为......”

例如,如果 object1 是 ObjectClass 类型,则不允许 object1 拥有 object1 独有的方法(成员函数),而是拥有定义为对象类的一部分。是对的吗? 对不起,我没有包括我的实际用例。我对了解 OOP 更感兴趣,这样我就可以自己正确地完成它。

编辑2 更详细地查看响应,我认为 lambda 表达式是可能的,只是不是我想象的那样。再次感谢

最佳答案

自然的 C++ 方法是按照 vsoftco 解释的那样,使用虚拟和继承。

但是,如果您的 Button 类已经具备了所需的一切,并且按钮之间唯一发生变化的是要执行的唯一(trhow-away)操作,您可能需要考虑这个替代方案:

class Button {
    function<void()>  f; 
public: 
    Button(function<void()> mf) : f(mf) {}
    void onClick() { f();  }
};

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

然后您可以将它与 lambda-functions 一起使用 如本例所示:

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

    button1.onClick();
    button2.onClick();
}

关于C++ 一个有自己方法的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28384297/

相关文章:

python - 安装 PyQt5 时出错 : const class QJsonValue’ has no member named ‘toInt’

java - Java中的结构类对象

javascript - 修改 Twitter Bootstrap 折叠插件以保持 Accordion 打开

c# - 在构造函数中实例化对象

c++ - 跟踪简单的递归函数

c++ - 仅包含基类 header 时访问派生类

c++ - 一组 weak_ptr

c++ - 为什么只有 static_cast 能够返回请求类型的新对象?

php 工具包而不是框架

c# - 如何使用静态变量而不搞乱我的单元测试?