2015-12-05 4 views
0

Я знаю, что этот вопрос не получает достаточного внимания, потому что он не часто встречается, но я хочу его прояснить.Циклическая зависимость в Eclipse CDT

Скажем, у меня есть 3 файла:

Ах

#ifndef A_h 
#define A_h 
#include "B.h" 
class A { 
    A(); 
    virtual ~A(); 
    bool someFunc(B& b); 
}; 
#endif 

Bh

#ifndef B_h 
#define B_h 
#include "A.h" 
class B { 
    B(); 
    virtual ~B(); 
    bool someFunc(A& a); 
}; 
#endif 

и main.cpp

#include "A.h" 
#include "B.h" 
int main() { return 0; } 

без защиты (#ifndef X_h #define X_h) существует циклический оттиск endency. Добавление защиты должно решить проблему, но когда код скомпилирован, сначала main.cpp пытается включить a.h, который пытается включить b.h перед объявлением и возвращает ошибку. Если мы изменим код:

Ач

#ifndef A_h 
#define A_h 
class A { 
    A(); 
    virtual ~A(); 
#include "B.h" 
    bool someFunc(B& b); 
}; 
#endif 

Bh

#ifndef B_h 
#define B_h 
class B { 
    B(); 
    virtual ~B(); 
#include "A.h" 
    bool someFunc(A& a); 
}; 
#endif 

Теперь Циклическая зависимость решена, но и код компилируется без ошибок, но все же Eclipse, возвращает ошибку: «Тип" B 'не может быть разрешен "в Ah, поэтому вам нужно добавить surpress к Ah и Bh, где используется другой. Я хочу знать, есть ли другой способ решить циклическую зависимость без Eclipse, возвращая ошибку и как должен выглядеть код, если у нас есть более двух классов (A включает B, C и D; B включает A, C, D .. .)

+0

Передовые декларации. – Downvoter

ответ

2

До тех пор, пока вы на самом деле не использовать экземпляр класса B в классе A и наоборот, и только объявить функции, принимающие указатели или ссылки, вы можете уйти, не включая вообще, и только объявить классы:

В файле ах

#ifndef A_h 
#define A_h 

class B; // Declare class B 

class A { 
    A(); 
    virtual ~A(); 
    bool someFunc(B& b); 
}; 
#endif 

и B.h

#ifndef B_h 
#define B_h 

class A; //Declare class A 

class B { 
    B(); 
    virtual ~B(); 
    bool someFunc(A& a); 
}; 
#endif 

В исходных файлах, где определены функции (реализованных) вам конечно нужно включить оба файла.

+0

Даже 'bool someFunc (класс B & b);' будет работать, то есть «локальная» форвардная декларация. – vsoftco

Смежные вопросы