Объявление объектов класса в заголовочном файле - PullRequest
6 голосов
/ 11 марта 2009

Приветствую всех.

Я, кажется, цепляюсь за фундамент, но я нигде не могу найти решение. В любом случае, пойдем дальше и объясним.

У меня есть программа, состоящая из трех файлов; main.ccp, add.h, add.cpp.

Я объявляю класс 'SA' в add.h и все мои функции определены в add.cpp

additional.h

class SA {
    ...
public
    int x;
} Obj1, Obj2;

main.ccp

#include "additional.h" 

int main() {

    Obj1.x = 5;

    ...
}

Это дает мне ошибку ссылки при компиляции: ошибка LNK2005: «класс SA Obj1» (? Obj1 @@ 3VSA @@ A) уже определен в main.obj

Единственное определение объекта происходит в add.h, и больше нигде. Программа компилируется просто отлично, если объявлять объекты в главном, а не в заголовке:

main.ccp

#include "additional.h" 

int main() {

    SA Obj1;
    Obj1.x = 5;

    ...
}

Проблема в том, что я хочу использовать объекты в основном в add.cpp, но мне все равно нужно инициализировать несколько открытых значений через main.cpp. Любые слова мудрости?

Ответы [ 3 ]

12 голосов
/ 11 марта 2009

Объявите Obj1 и Obj2 в вашем .cpp вместо .h

add.h

class SA {
 ...
public
    int x;
};

main.cpp

#include "additional.h" 

SA Obj1, Obj2;

int main() {

 Obj1.x = 5;

 ...
}

Если вы хотите объявить Obj1 и Obj2 в вашем файле .h, добавьте extern в файл .h следующим образом:

extern SA Obj1, Obj2;

но вы должны объявить объекты в файле .cpp в вашем проекте:

main.cpp

SA Obj1, Obj2;

Причина этого в том, что каждый раз, когда вы включаете файл .h, вы объявляете Obj1 и Obj2. Поэтому, если вы включите файл .h два раза, вы создадите два экземпляра Obj1 и Obj2. Добавляя ключевое слово extern, вы сообщаете компилятору, что вы уже удалили эти две переменные где-то в вашем проекте (предпочтительно в файле .cpp).

6 голосов
/ 11 марта 2009

Используйте ключевое слово extern . Объявите эти открытые объекты как extern в заголовке, затем определите экземпляры в одном из cpps.

Как это:

extern SA Obj1; // in header

SA Obj1;// in any one (no more than one) cpp
4 голосов
/ 25 февраля 2010

Вы также можете иметь следующую строку кода в заголовочном файле:

static SA Obj1, Obj2;

Это создаст только 1 экземпляр каждого объекта во время выполнения и предотвратит переопределения. Однако имейте в виду, что все файлы, которые содержат файл .h, будут использовать один и тот же экземпляр этих двух объектов, поэтому вам нужно быть осторожным при обращении к ним.

...