Ошибка с включением файлов - PullRequest
0 голосов
/ 05 января 2012

У меня есть структура класса

Class A
{
   Object of classB
   Object of classC
}

Теперь для этого у меня есть файлы A.h / A.m B.h / B.m, C.h / C.m Теперь у меня есть отдельный файл G.h, в котором есть ряд глобальных переменных, которые используются всеми классами A, B, C Теперь я импортировал B.h, C.h, G.h внутри A.h. Я также отдельно импортировал файл G.h внутри B.h и C.h

Теперь при сборке проекта я получаю ошибку ссылки для дублированного символа на глобальные переменные (что, вероятно, связано с многократным включением файла G.h).

Как я могу решить это ??? Ниже приведена структура моего кода

//A.h

#import "B.h"
#import "C.h"
#import "G.h"

@interface A : NSObject {
  B *b;
  C *c;
}
//B.h
#import "G.h"

//C.h

#import "G.h"

//G.h
A *a=nil;
@interface G : NSObject { //whole class is empty}

Ответы [ 2 ]

3 голосов
/ 05 января 2012

Вы должны объявить свои глобальные переменные в G.h, но определить их в G.m, чтобы они связывались в цели только один раз. Так, если, например, у вас есть строковая константа, которая определена глобально, вы должны сделать:

G.h

extern NSString const *appName;

G.m

NSString const *appName = @"My Great App";

В вашем вставленном коде это экземпляр A, который дублируется. Он импортируется в каждую единицу перевода, но каждый раз с тем же именем, что означает, что скомпилированные объекты не могут быть связаны. Предполагая, что вам нужен общий A экземпляр с именем a, вам нужно сделать:

G.h

@class A;
extern A *a;

G.m

#import "A.h"
#import "G.h"

A *a = nil;
0 голосов
/ 05 января 2012

Используйте директиву компилятора @class в заголовках классов вместо импорта заголовков других классов.@class предоставляет прямое объявление данного класса, поэтому вы можете отложить импорт его заголовка до тех пор, пока он вам действительно не понадобится, что обычно происходит в соответствующем .m файле.* Итак, вместо чего-то вроде этого:

 #import "B.h"

 @interface A : NSObject
 {
     B someObj;
 } 

... сделать это

 @class B;

 @interface A : NSObject
 {
     B someObj;
 } 

Теперь компилятор поймет, что B является именем класса, и поэтомуиспользовать его как тип данных без импорта заголовка B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...