C ++ включает в себя - файлы перекрестных ссылок - PullRequest
0 голосов
/ 12 марта 2011

В C ++ у меня есть A.h и B.h. Мне нужно включить A.h в B.h, тогда мне нужно было использовать объект из B внутри A.cpp. Поэтому я включил B.h в A.h, чтобы он отказался. Я пытался использовать эти строки в файлах .H

#ifndef A_H
#define A_H
...my code
#endif

Я же отказался. поэтому я попытался в файле A.h поставить

class B;

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

Ответы [ 3 ]

2 голосов
/ 12 марта 2011
1 голос
/ 12 марта 2011

Вы не можете включить Ah в Bh, а также включить Bh в Ah - это круговая зависимость.

Если структура или функция в A должна ссылаться на указатель на структуру в B (и наоборот) вы можете просто объявить структуры, не определяя их.

В Ah:

 #ifndef __A_H__
 #define __A_H__

 struct DefinedInB;

 struct DefinedInA
 {
     DefinedInB* aB;
 };

 void func1(DefinedInA* a, DefinedInB* b);

 #endif __A_H__

В Bh:

 #ifndef __B_H__
 #define __B_H__

 struct DefinedInA;

 struct DefinedInB
 {
     DefinedInA* anA;
 };

 void func2(DefinedInA* a, DefinedInB* b);

 #endif __B_H__

Вы можете сделать это только с помощью указателей, опять жечтобы избежать круговой зависимости.

0 голосов
/ 12 марта 2011

В целом, лучше избегать циклических ссылок, но если они нужны в вашем дизайне, и ваши зависимости следующие:

a.h <-- b.h <-- a.cpp (where x <-- y represents "y" depends on "x")

Просто введите это:

// A.h
#ifndef A_HEADER
#define A_HEADER
...
#endif

// B.h
#ifndef B_HEADER
#define B_HEADER
#include "A.h"
...
#endif

// A.cpp
#include "A.h"
#include "B.h"
// use contents from both A.h and B.h
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...