【问题标题】:Is it possible to assign a static function to a public member function during a class's construction?是否可以在类的构造过程中将静态函数分配给公共成员函数?
【发布时间】:2018-12-04 01:16:01
【问题描述】:
    CursorMove::CursorMove(char& dir)
    {
        if(dir == 'd')
        {
            this->execute = CursorMove::moveRight;
        }
        else if(dir == 'a')
        {
            this->execute = CursorMove::moveLeft;
        }
        else if(dir == 'w')
        {
            this->execute = CursorMove::moveUp;
        }
        else if(dir == 's')
        {
            this->execute = CursorMove::moveDown;
        }
    }

我目前正在处理一个 CS 项目,我们必须能够使用键盘移动光标。教授希望通过类来完成,因为我们将使用一个 while 循环来不断检查用户输入,然后只有一个父类将调用其执行。每个独特的执行都属于其自己的类。我认为尝试将光标移动的命令合并为一个可能会更容易。我的想法是使用名为 moveRight、moveLeft、moveUp 和 moveDown 的公共静态函数,它们都具有与 execute 相同的参数,并相应地分配以在构造期间执行。哪一个由名为“dir”的参数决定。

我目前遇到的错误是“必须调用对非静态成员函数的引用”。与其解决错误,我更好奇这是否是一个可行的想法,或者我是否最好忽略它并为每个人创建一个类。

【问题讨论】:

  • 只有当execute 被声明为std::function,或者至少是一个普通的function pointer 时,你所要求的才能完成。但如果它被实现为自己的实际类方法,则不会。
  • 这里的char& 中没有& 的理由。
  • 你可能想改写&CursorMove::moveRight
  • 这是一个聪明的主意。但我看不出这里有任何使用面向对象编程的理由。似乎只是需要用户输入和命令列表之间的映射。
  • 是的,这完全合理。如果您遇到问题,请提供您一直在调试问题的minimal reproducible example,以便我们为您提供帮助。

标签: c++


【解决方案1】:

我更好奇这是否是一个可行的想法,或者我是否最好忽略它并为每个人制作一个课程。

总体方案是可行的。它似乎比 C++ 更像是一种 C 风格的方法,但支持该功能。如何让它工作取决于你的类声明,但你说你对“如何”不感兴趣(但我会注意到“静态”部分影响“如何”,而不是可行性)。

不过,您可能想考虑一下“为什么”。您所做的基本上是创建一个成员虚函数表,类似于如果您声明一个名为 execute 的虚函数,然后声明派生类以覆盖该函数,编译器将生成的表。编译器的版本有一些不错的好处,例如处理dir 不是预期值之一的情况(可能通过编译时错误)。您希望通过您的方法获得什么好处?

【讨论】:

    【解决方案2】:

    您的代码看起来像这样吗?如果是这样,那么这对我来说很好:

    #include <iostream>
    using namespace std;
    
    class CursorMove
    {
            public:
                    int (*execute)(void);
                    static int moveLeft();
                    static int moveRight();
                    static int moveUp();
                    static int moveDown();
    
                    CursorMove(char& dir);
    };
    int CursorMove::moveLeft()
    {
            cout<<"in move left"<<endl;
            return 1;
    }
    
    int CursorMove::moveRight()
    {
            cout<<"in move Right"<<endl;
            return 1;
    }
    
    int CursorMove::moveUp()
    {
            cout<<"in move Up"<<endl;
            return 1;
    }
    
    int CursorMove::moveDown()
    {
            cout<<"in move Down"<<endl;
            return 1;
    }
    
    CursorMove::CursorMove(char& dir)
    {
            if(dir == 'd')
            {
                    this->execute = CursorMove::moveRight;
            }
            else if(dir == 'a')
            {
                    this->execute = CursorMove::moveLeft;
            }
            else if(dir == 'w')
            {
                    this->execute = CursorMove::moveUp;
            }
            else if(dir == 's')
            {
                    this->execute = CursorMove::moveDown;
            }
    }
    
    int main()
    {
            char dir = 'a';
            CursorMove *obj = new CursorMove(dir);
            obj->execute();
            return 1;
    }
    

    【讨论】:

    • 缺少delete,但不需要new
    • 请在答案中描述解决方案,不要只发布代码。代码应该用来澄清答案。
    • 要点@MaartenBodewes 这是我在 Stack Overflow 社区的第一篇文章。我会在以后的帖子中记住这一点。谢谢。
    • 没问题,欢迎迟来的 Indranil;我看到你的其他帖子的表现要好得多:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2018-09-10
    相关资源
    最近更新 更多