对不起,这可能是个愚蠢的问题。我显然误解了面向对象编程的一些基本知识。我习惯了 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/