如何使同一类的对象在同一函数中做不同的事情

How can I make objects of the same class do different things in the same function?

本文关键字:函数 不同的事 何使同 一类 对象      更新时间:2023-10-16

我正在用C++制作一个游戏,想知道如何让一个类的两个对象在调用同一个函数时做不同的事情。我的意思是,我有两个按钮,当我点击其中一个时,它应该开始游戏,当我单击另一个时它应该结束游戏。这只是一个简单的例子,但基本上我只想调用函数click(),你点击的按钮将执行与其他按钮不同的代码。

我假设,您正在构建自己的游戏引擎,而不是使用实际处理这些事情的库。

您要做的是为每个函数注册一个回调。这就是所有UI库/框架的作用

class Button{
std::function<void()> callback;
public:
void connect(std::function<void()> func){
   callback=func
}
void click(){
  callback();
}
};

通过提供不同的回调进行连接,可以实现不同的功能。

我认为您正在寻找的是所谓的多态性。查看代码:

    #include <iostream>
    using namespace std;
    class Button
    {
    public:
            virtual void click()
            {
                    cout << "Button clickn";
            }
    };
    class StartButton : public Button
    {
    public:
            void click()
            {
                    cout << "Start clickn";
            }
    };
    class EndButton : public Button
    {
    public:
            void click()
            {
                    cout << "End clickn";
            }
    };
    void make_click (Button * button)
    {
            button -> click();
    }
    int main ()
    {
            StartButton * start = new StartButton();
            EndButton * end = new EndButton();
            make_click(start);
            make_click(end);
            return 0;
    }

输出为:

    Start click
    End click

在这里你可以找到一个不错的教程。

在函数中放入一个条件,检查对象的某些属性,例如实例变量的值。

您可以将函数对象(functor)或函数指针作为数据成员
每个实例将为单击提供不同的函子。

一种方法是创建一个接口(对于C++,它是一个具有纯虚拟方法和虚拟析构函数的类)。让我们调用该类clickHandler来执行按钮示例。在点击处理程序上调用doclick的点击函数中,已经给出了按钮。现在,当你创建按钮时,你会给它们一个clickHandler的子类,它可以做正确的事情。

其他选项包括使用C++新添加的lambda。

坦率地说,这听起来像是糟糕的设计。几乎唯一的方法是将标志或状态以其他形式传递给方法。但如果你正在这样做,Button已经掌握了需要做什么的所有知识,你还可以创建和调用单独的方法。或者,您可以放弃让对象属于同一类的要求,并将继承与虚拟方法一起使用。然而,如果不同的子类对那些可能是糟糕设计的标志的子类有着截然不同的语义。因此,我建议使用不同的方法并显式调用它们。