C++静态成员函数和变量

Max*_*aga 11 c++

我正在通过进行小型机器人模拟来学习C++,而我在类中的静态成员函数方面遇到了麻烦.

我的环境类定义如下:

class Environment {
    private:
        int numOfRobots;
        int numOfObstacles;

        static void display(); // Displays all initialized objects on the screen

    public:
        Robot *robots;
        Obstacle *obstacles;

        // constructor
        Environment();

        static void processKeySpecialUp(int, int, int); // Processes the keyboard events
};
Run Code Online (Sandbox Code Playgroud)

然后在构造函数中我初始化机器人和障碍物,如下所示:

numOfRobots = 1; // How many robots to draw
numOfObstacles = 1;
robots = new Robot[numOfRobots];
obstacles = new Obstacle[numOfObstacles];
Run Code Online (Sandbox Code Playgroud)

以下是使用这些变量的静态函数示例:

void Environment::display(void) {
    // Draw all robots
    for (int i=0; i<numOfRobots; i++) {
        robots[i].draw();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,我会收到类似的错误消息

error: invalid use of member ‘Environment::robots’ in static member function
Run Code Online (Sandbox Code Playgroud)

我尝试将numOfRobots,numOfObstacles,机器人和障碍物静态化,但后来我遇到了错误

error: undefined reference to 'Environment::numOfRobots'
Run Code Online (Sandbox Code Playgroud)

我非常感谢有人可以解释我做错了什么.谢谢!

Tor*_*bio 16

静态方法不能使用其类中的非静态变量.

这是因为可以像Environment::display()没有类实例一样调用静态方法,这使得在其中使用的任何非静态变量都是不规则的,也就是说,它们没有父对象.

您应该考虑为什么要尝试使用静态成员来实现此目的.基本上,如何使用静态方法的一个例子是这样的:

class Environment
{
private:
    static int maxRobots;
public:
    static void setMaxRobots(int max)
    {
        maxRobots = max;
    }
    void printMaxRobots();
};

void Environment::printMaxRobots()
{
    std::cout << maxRobots;
}
Run Code Online (Sandbox Code Playgroud)

您必须在全局范围内初始化变量,例如:

int Environment::maxRobots = 0;
Run Code Online (Sandbox Code Playgroud)

然后,main例如,你可以使用:

Environment::setMaxRobots(5);

Environment *env = new Environment;
env->printMaxRobots();
delete env;
Run Code Online (Sandbox Code Playgroud)