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

时间:2014-04-25 19:49:10

标签: c++

我正在使用C ++制作游戏,并且想知道在调用相同的函数时如何使类的2个对象执行不同的操作。我的意思是我有2个按钮,当我点击一个按钮时,它应该启动游戏,当我点击另一个时它应该结束它。这只是一个简单的例子,但基本上我只想调用函数click(),你点击的按钮将执行与其他每个按钮不同的代码。

6 个答案:

答案 0 :(得分:3)

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

您要做的是为每个功能注册一个回调。这就是所有UI库/框架的作用。举个简单的例子:

class Button{
std::function<void()> callback;

public:

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

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

答案 1 :(得分:2)

在函数检查中为条件的某些属性添加条件,例如:实例变量的值。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

我认为你所寻找的是多态性。看看代码:

    #include <iostream>
    using namespace std;
    class Button
    {
    public:
            virtual void click()
            {
                    cout << "Button click\n";
            }
    };

    class StartButton : public Button
    {
    public:
            void click()
            {
                    cout << "Start click\n";
            }
    };

    class EndButton : public Button
    {
    public:
            void click()
            {
                    cout << "End click\n";
            }
    };

    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

Here你可以找到一个很好的教程。

答案 4 :(得分:1)

一种方法是创建一个接口(对于C ++,它是一个具有纯虚方法和虚析构函数的类)。让我们调用该类clickHandler以使用您的按钮示例。在click函数中,您在clickHandler上调用了doclick按钮。现在,当您创建按钮时,您可以为它们提供clickHandler的子类,以完成正确的操作。

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

答案 5 :(得分:0)

坦率地说,这听起来很糟糕。实现此目的的唯一方法是将标志或其他形式的状态传递给方法。但是,如果您正在这样做,那么Button已经掌握了所有需要完成的知识,您也可以创建并调用单独的方法。或者,您可以放弃使对象属于同一类并使用虚方法继承的要求。但是,如果不同的子类对那些可能是糟糕设计的标志的语义有很大的不同。所以我建议使用不同的方法并明确地调用它们。