Создание Глобальной Структуры в C ++ Программе - PullRequest
3 голосов
/ 23 марта 2010

Я пытаюсь создать глобальную структуру, которая будет видна из любой части исходного кода. Мне это нужно для моего большого проекта 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

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

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

Когда я пытаюсь собрать это небольшое приложение, компиляция работает нормально, но компоновщик возвращает мне ошибку:

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

Существует ли какое-либо решение?

Спасибо.

Ответы [ 3 ]

8 голосов
/ 23 марта 2010

Да. Во-первых, не определяйте num в заголовочном файле. Объявите его как extern в заголовке, а затем создайте файл Global.cpp для хранения глобального или поместите его в main.cpp, как подсказал ответ Томаса Джонса-Лоу.

Во-вторых, не используйте глобалы.

В-третьих, typedef не требуется для этой цели в C ++. Вы можете объявить свою структуру следующим образом:

struct  TNum {
    int g_nNumber;
};
2 голосов
/ 23 марта 2010

Поскольку вы пишете на C ++, используйте следующую форму объявления для структуры:

struct  TNumber {
    int g_nNumber;
};

extern TNumber Num;

typedef не нужен.

2 голосов
/ 23 марта 2010

In global.h

extern TNum Num;

затем вверху main.cpp

TNum Num;
...