在类的构造过程中是否可以将静态函数分配给公共成员函数?

时间:2018-12-04 01:16:01

标签: c++

    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”的参数确定。

我当前遇到的错误是“必须调用对非静态成员函数的引用”。除了解决错误之外,我更好奇这是否可行,还是我最好不理会它,只为每个人做一个课堂。

2 个答案:

答案 0 :(得分:2)

  

我对这是否可行是一个很好的好奇,还是我最好不理会它,只为每个人上一堂课。

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

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

答案 1 :(得分:0)

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

#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;
}