我正在使用C ++制作游戏,并且想知道在调用相同的函数时如何使类的2个对象执行不同的操作。我的意思是我有2个按钮,当我点击一个按钮时,它应该启动游戏,当我点击另一个时它应该结束它。这只是一个简单的例子,但基本上我只想调用函数click(),你点击的按钮将执行与其他每个按钮不同的代码。
答案 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已经掌握了所有需要完成的知识,您也可以创建并调用单独的方法。或者,您可以放弃使对象属于同一类并使用虚方法继承的要求。但是,如果不同的子类对那些可能是糟糕设计的标志的语义有很大的不同。所以我建议使用不同的方法并明确地调用它们。