【问题标题】:C++ global pointer shared by different files不同文件共享的 C++ 全局指针
【发布时间】:2013-03-25 23:56:39
【问题描述】:

所以我正在尝试制作一个 C++ / OpenGL 程序(使用 Visual Studio 2010),它使用一个名为 Operation 的类来处理键盘输入。重点是学习一些东西,因为我对 C++ 和 OpenGL 都是新手。

我正在使用数组“bool keysDown[256]”来存储按下了哪些键。同样,我想创建一个操作数组 'Operation *keyOps[256]' 来操作这些键。

我的问题来了,这些键中的大多数都没有操作,所以我想要一个完全什么都不做的操作类,但我只需要一个不同文件可以使用的全局实例/指针。

现在我想做的是以某种方式创建这个“无操作”类的单个实例,并使其可用于包含此标头的任何文件,而无需在每个文件中声明它。 (类似于 NULL,仅以 Operation 类的形式出现)

到目前为止,我的“解决方案”是使用这样的命名空间,

(操作.h)

#ifndef _OPERATION_H
#define _OPERATION_H

#include <iostream>

#include <GL\glut.h>

namespace operations{

    class Operation{
        protected:
            std::string _name;
        public:
            Operation(std::string name) : _name(name){}
            virtual void operate()=0;
            std::string getName(){return _name;}
    };

    (...)

    class OPnop: public Operation{
        public:
            OPnop(): Operation("No operation"){}
            void operate(){}
    };
    static OPnop OPNOP;
    Operation* nop(); //implemented in .cpp > {return &OPNOP;}

    (...)
};
#endif

其他文件可以使用 operations::nop() 函数获得指向 OPNOP 实例的指针。我已经测试过并且可以正常工作,但我不确定这是否在后台按预期工作。

我一直在寻找全局变量的 extern 和 static 用法,但我可能并不完全理解,也没有找到与我的问题相关的答案。如果我没记错的话,extern 变量也必须在其他文件中声明,而 static 会为包括它在内的每个文件创建不同的变量。

所以我的问题是,有没有办法声明/实例化这个“无操作”,以便包括这个头文件在内的所有文件都可以直接访问同一个唯一实例,而不必使用函数?

【问题讨论】:

  • 请注意,您的包含保护 _OPERATION_H 使用 reserved identifier 和一个下划线,后跟一个大写字母。

标签: c++ pointers static


【解决方案1】:

确实,static 关键字在命名空间上下文中的含义与类上下文中的含义不同。我相信您想要做的是在您的标头中将其声明为 extern,并在实现 (.cpp) 文件中将其初始化一次。看看this question

【讨论】:

  • 我创建了两个外部变量,一个实例和一个指向该实例的指针,然后在 .cpp 文件中初始化它们。非常感谢!
【解决方案2】:

我做了类似的事情here

我正在使用带有单个全局实例的 Gesture 类作为 gGesture 来处理所有用户交互。

    // .h file
    struct Gesture_{
        int fingers;
        int taps;
        eGestureAction action;
        bool continious;
    };
    typedef struct Gesture_ Gesture;

    extern Gesture gGesture;

为了回答您关于静态与外部的问题,外部通过不向所有翻译单元添加相同的符号来避免链接器问题。

注意事项:

  1. 该代码最初旨在用于基于 C 的项目,但我想您会明白的。

  2. Gesture 对象适用于基于触摸的设备。

【讨论】:

    猜你喜欢
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多