Круговые зависимости в с ++ - PullRequest
       26

Круговые зависимости в с ++

0 голосов
/ 11 сентября 2011

Скажите, у меня есть эти два класса:

// a.h

#include "b.h"

и

// b.h

include "a.h"

Я понимаю, что здесь есть проблема, но как я могу ее исправить и использовать a объекты и их методы в классе b и наоборот?

Ответы [ 4 ]

2 голосов
/ 11 сентября 2011

Вы можете использовать предварительные объявления, например:

class B;

class A
{
    B* ThisIsValid;
}

class B
{
    A SoIsThis;
}

Для получения дополнительной информации см. этот SO вопрос.

Что касается препроцессора #include sЕсть, вероятно, лучший способ организовать ваш код.Без полной истории трудно сказать.

1 голос
/ 11 сентября 2011

Чтобы расширить ответ @Borealid:

Чтобы избежать проблем с круговыми включениями, используйте «include guard»

например.

#ifndef MYFILE_H /* If this is not defined yet, it must be the first time
 we include this file */
#define MYFILE_H // Mark this file as already included
// This only works if the symbol we are defining is unique.

// code goes here

#endif 
0 голосов
/ 11 сентября 2011

«Другой» класс может иметь только ссылку или указатель на «первый» класс.

в файле a.h:

#include "b.h"

struct a {
    b m_b;
};

в файле b.h:

struct a;

struct b {
    a* m_a;
};

void using_the_a_instance(b& theb);

в файле b.cpp:

#include "b.h"
#include "a.h"

void using_the_a_instance(b& theb)
{
    theb.m_a = new a();
}
0 голосов
/ 11 сентября 2011

Вы можете использовать так называемое «предварительное объявление».

Для функции это будет что-то вроде void myFunction(int);.Для переменной это может выглядеть как extern int myVariable;.Для класса class MyClass;.Эти бестелесные операторы могут быть включены перед фактическими объявлениями, несущими код, и предоставляют компилятору достаточно информации для создания кода, использующего объявленные типы.

Чтобы избежать проблем с циклическими включениями, используйте «include guard»- #ifdef вверху каждого заголовочного файла, что предотвращает его включение дважды.

...