在C++程序中实现全局结构

mos*_*osg 3 c++ struct global

我正在尝试创建全局结构,这将从源代码的任何部分看出.我需要它用于我的大型Qt项目,需要一些全局变量.这是:3个文件(global.h,dialog.h和main.cpp).对于编译,我使用Visual Studio(Visual C++).

global.h

#ifndef GLOBAL_H_
#define GLOBAL_H_

typedef struct  TNumber {
    int g_nNumber;
} TNum;

TNum Num;

#endif
Run Code Online (Sandbox Code Playgroud)

dialog.h

#ifndef DIALOG_H_
#define DIALOG_H_

#include <iostream>
#include "global.h"

using namespace std;

class   ClassB {
public:
    ClassB() {};

    void    showNumber() {
        Num.g_nNumber = 82;
        cout << "[ClassB][Change Number]: " << Num.g_nNumber << endl;
    }
};

#endif
Run Code Online (Sandbox Code Playgroud)

main.cpp

#include <iostream>

#include "global.h"
#include "dialog.h"

using namespace std;

class   ClassA {
public:
    ClassA() {
        cout << "Hello from class A!\n";
    };
    void    showNumber() {
        cout << "[ClassA]: " << Num.g_nNumber << endl;
    }
};

int main(int argc, char **argv) {
    ClassA  ca;
    ClassB  cb;
    ca.showNumber();
    cb.showNumber();
    ca.showNumber();
    cout << "Exit.\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我试图构建这个小应用程序时,编译工作正常,但链接器给我一个错误:

1>dialog.obj : error LNK2005: "struct TNumber Num" (?Num@@3UTNumber@@A) already defined in main.obj

有没有解决方案?

谢谢.

Fre*_*son 8

是.首先,不要num在头文件中定义.extern在标题中声明它,然后创建一个文件Global.cpp来存储全局,或者将其放入main.cppThomas Jones-Low的回答中.

其次,不要使用全局变量.

第三,typedef在C++中没有必要为此目的.您可以像这样声明您的结构:

struct  TNum {
    int g_nNumber;
};
Run Code Online (Sandbox Code Playgroud)

  • 如果提供全局变量的替代方案,这个答案会更有用 (2认同)
  • @WilliamFitzPatrick 全局变量有其一席之地,特别是 _static_ 全局变量,它们仅在特定源文件中可见。也许您的程序根本就不是数百万行、数百人共同开发的程序?也许在整个代码中将该配置对象从一个函数传递到另一个函数没有意义?也许您只是将配置粘贴到一个静态全局结构中,以便所有本地到该文件的函数都可以访问该配置,该配置甚至仅由*一个*解析函数写入,但可以在多个位置读取。 (2认同)