如何使同一类的对象在同一函数中做不同的事情
How can I make objects of the same class do different things in the same function?
我正在用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已经掌握了需要做什么的所有知识,你还可以创建和调用单独的方法。或者,您可以放弃让对象属于同一类的要求,并将继承与虚拟方法一起使用。然而,如果不同的子类对那些可能是糟糕设计的标志的子类有着截然不同的语义。因此,我建议使用不同的方法并显式调用它们。
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 从不同的附加依赖项中识别等同命名的函数
- 为什么glGetSubroutineIndex为不同的函数返回相同的值?
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- 从不同的 cpp 调用回调函数会导致bad_function_call
- c++ lambda:柯里和函数:使用按值捕获与按引用捕获返回不同的结果
- 如何编写具有相同名称的相同函数,该函数在C++中几乎以相似的方式处理不同的类参数?
- 我可以将向量作为initial_sum和不同的函数传递给 std::累积吗?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 我需要将数组传递给函数以平均不同的测试分数
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- C++ exp 在 i7-3770 和 i7-4790 上的 x64 下函数不同的结果
- 与复制构造函数不同的移动构造函数的静态断言
- C++ 实例化与类中的函数不同的类
- 与g++-7.0中的constexpr函数不同的行为/访问硬件
- 从这个类构造函数调用类构造函数>(不同的参数)?
- 重载与原始函数不同的函数仅在参数列表中"const"
- 返回与定义的多态函数不同的类型