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

2023-12-20

我正在通过制作小型机器人模拟来学习 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
};

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

numOfRobots = 1; // How many robots to draw
numOfObstacles = 1;
robots = new Robot[numOfRobots];
obstacles = new Obstacle[numOfObstacles];

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

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

当我尝试编译时,我收到如下错误消息

error: invalid use of member ‘Environment::robots’ in static member function

我尝试制作 numOfRobots、numOfObstacles、机器人和障碍物static,但后来我遇到了类似的错误

error: undefined reference to 'Environment::numOfRobots'

我非常感谢有人能解释我做错了什么。 谢谢你!


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

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

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

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

void Environment::printMaxRobots()
{
    std::cout << maxRobots;
}

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

int Environment::maxRobots = 0;

然后,里面main例如,您可以使用:

Environment::setMaxRobots(5);

Environment *env = new Environment;
env->printMaxRobots();
delete env;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 静态成员函数和变量 的相关文章

随机推荐

  • Log4cplus RollingFileAppender 是否异步

    我将为我们的应用程序添加 Log4cplus 我们的应用程序是用 C 编写的 并且是多线程的 我想使用 Log4Cplus RollingFileAppender 来实现同样的目的 我知道Log4Cplus源自Java Log4j 由于我不
  • 在集群内运行 kubectl

    我有一个 Kubernetes 1 10 集群已启动并正在运行 使用以下命令 我创建一个在集群内运行 bash 的容器 kubectl run tmp shell rm i tty image centos bin bash 我在正在运行的
  • 将对象转换为键值对象数组,例如 `{ name: "Apple", value: "0.6" }`

    我有一个这样的对象 const total Apple 0 6 Banana 0 6 Orange 1 Grapes 0 4 Pineapple 0 4 现在我想将其转换为键值对象数组 其中每个对象具有相同的两个属性集 name and v
  • gnuplot 中带有参数图的 for 循环

    我正在尝试在 gnuplot 4 6 中绘制多个参数曲线 在早期版本 4 4 中 命令 set para 为 a 1 10 a cos t a sin t 绘制 pi pi 参数模式和迭代之间的语法歧义是当前 gnuplot 版本中已记录的
  • 如何提取 vcxproj 中每个编译单元的编译参数?

    我正在尝试获取每个编译单元的编译参数 以便我可以创建 编译命令 json http clang llvm org docs JSONCompilationDatabase html 对于我的 vcxproj 它可以与 clang 的 lib
  • 如何在 Cython 中使用 128 位整数

    在我的 64 位计算机上long long类型有 64 位 print sizeof long long prints 8 我需要使用 128 位整数 幸运的是海湾合作委员会支持这些 https gcc gnu org onlinedocs
  • 如何读取 PDF 文本矩阵

    我正在编写一个程序来直接从我的程序创建 PDF 文件 我已经使用了 PDF 参考手册 并设法弄清楚除了一件事之外的所有内容 文本矩阵 它一定是我读过的最令人困惑的东西 谷歌搜索 重新阅读 重新谷歌搜索 重新阅读 但仍然不理解它 就在我以为我
  • 元刷新和重定向页面?

    我创建了一个带有 META 标记的网页 如下所示 问题是移动浏览器不支持此元标记 尽管它确实在每个浏览器上的网络中正确重定向 网页的完整代码在这里
  • 无法使用 000webhost 连接到数据库

    我正在尝试学习 php 但是当我尝试连接到 mysql 数据库时 出现此错误 我认为代码本身没有任何问题 但主机端可能有错误 我使用的是000webhost 警告 mysqli mysqli mysqli mysqli 28000 1045
  • 如何修复“参数列表太长”错误?

    我执行了这个命令 从文件夹 train 中的大量文件 大约 3000 个 中删除所有出现的 perl pi e s g Users Kian Desktop Acsegment espslabs train 但我得到了这个错误 bin ba
  • 单词表-uima ruta

    实际上我在Wordlist中使用了一些CITY名称和PUBLISHERS名称 根据我的理解 Wordlist将注释文档中任何列表项的所有出现 但是我发现一个问题 当我更改列表项的顺序时 出现的次数增加或减少列表中的文本 例如 Script
  • WebApi Route 返回 Not Found in Orchard Module

    我正在创建一个 Orchard 模块 我想在其中添加 WebApi 控制器 我的模块 txt Name ModuleName AntiForgery enabled Author The Orchard Team Website http
  • 处理 XXX.js 的源映射花费的时间比 YYY 毫秒长,因此我们继续执行而不等待所有断点

    Edit 这实际上也发生在新创建的准系统 React Typescript 模板 ViteJS 应用程序上 并且零修改 在 App tsx 中放置断点会使 VS Code 调试器启动速度慢得难以忍受 原帖如下 我正在尝试 ViteJS 也许
  • 使用计时器间隔与任务延迟重复执行任务

    我正在实施一项预定的工作 例如方法 并已缩小到方法范围 一种实现计时器间隔 另一种基于任务延迟 我还考虑过使用 Azure 计时器触发的 Web 作业 但它们不能在多实例模式下工作 实际上 在多实例应用程序中 其中一个实例中仅触发一个触发器
  • C++11 无限制联合示例

    I read http www stroustrup com C 11FAQ html unions http www stroustrup com C 11FAQ html unions 但我无法编译给定的示例 union U1 int
  • Android:使用Raw PCM创建Wave文件,Wave文件无法播放

    我已经为波形文件创建了标题 但创建的波形文件无法播放 我用过这个https ccrma stanford edu courses 422 projects WaveFormat https ccrma stanford edu course
  • 古老的重叠菜单,如何对 activeX 进行 z 索引

    我的页面上有一个 ActiveX 我知道 ActiveX 废话 由于某些逻辑业务原因 我们必须使用 ActiveX 但是问题是我无法制作 ActiveX低于其他任何东西 太奇怪了 活生生的简单例子 http adwiza com x ocx
  • Gitlab CI / Docker:使用自定义映像进行作业

    这就是我做一些 linter 测试 eslint 的方法 linter image ubuntu 16 04 stage test tags testing before script apt get update y apt get in
  • Django 下载文件为空

    我正在编写一个简单的函数 用于从服务器下载某个文件到我的机器 该文件由其 id 表示是唯一的 文件被正确定位 并且下载完成 但是下载的文件 尽管命名为服务器上的文件 是空的 我的下载功能如下所示 def download course re
  • C++ 静态成员函数和变量

    我正在通过制作小型机器人模拟来学习 C 但在类内的静态成员函数方面遇到了麻烦 我的环境类定义如下 class Environment private int numOfRobots int numOfObstacles static voi