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

Posted

技术标签:

【中文标题】如何让同一个类的对象在同一个函数中做不同的事情?【英文标题】:How can I make objects of the same class do different things in the same function? 【发布时间】:2014-04-25 19:49:10 【问题描述】:

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

【问题讨论】:

将状态(按钮编号)放入类中,并让您的函数选择如何处理它 使用继承和虚函数指向成员函数的指针一些指定要执行的操作的标志。 @CaptainObvlious 我认为在这种情况下继承比需要的要复杂一些。 @La-comadreja 一个带有虚拟OnClick成员函数的简单按钮类一点也不复杂。 【参考方案1】:

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

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

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

public:

void connect(std::function<void()> func)
   callback=func

void click()
  callback();

;

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

【讨论】:

+1。如果按钮具有相同的代码,std::function 成员可能是正确的答案。【参考方案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你可以找到一个很好的教程。

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

一种方法是创建一个接口(对于 C++,它是一个具有纯虚方法和虚析构函数的类)。让我们调用该类 clickHandler 以使用您的按钮示例。在 click 函数中,您在 clickHandler 上调用 doclick,该按钮已给出。现在,当你创建你的按钮时,你给它们一个 clickHandler 的子类来做正确的事情。

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

【讨论】:

【参考方案6】:

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

【讨论】:

这不是一个糟糕的设计。使用回调来自定义行为是一种标准模式。参见例如回答***.com/a/23301983/280314怎么做。

以上是关于如何让同一个类的对象在同一个函数中做不同的事情?的主要内容,如果未能解决你的问题,请参考以下文章

在另一个类中做数据成员的对象,可以先不初始化

如何让一个向量接受具有相同基类的 2 个不同的类?

在 TypeScript 中,我可以轻松地键入命名箭头函数,但是如何在基于函数关键字的函数中做同样的事情呢?

创建一个对象都在内存中做了什么事情

C++:返回一个可以是特殊派生类的对象

Student s = new Student();在内存中做了哪些事情?