Проблемы с круговой зависимостью - PullRequest
0 голосов
/ 23 марта 2012

Я попытался решить проблемы, связанные с циклической зависимостью, в некоторых файлах, которые я создал, следуя этой структуре:

хиджры

#include "B.h"
#include "C.h"
#include "D.h"

namespace NS {

class B;
class C;
class D;

class A {

/* ... */

    A(const A& a) {};

    A(const B& a) {};
    A(const C& a) {};
    A(const D& a) {};

/* ... */
};

}; // NS END

B.h

#include "A.h"
#include "C.h"
#include "D.h"

namespace NS {

class A;
class C;
class D;

class B {

/* ... */

    B(const B& a) {};

    B(const A& a) {};
    B(const C& a) {};
    B(const D& a) {};

/* ... */
};

}; // NS END

C.h

#include "A.h"
#include "B.h"
#include "D.h"

namespace NS {

class A;
class B;
class D;

class C {

/* ... */

    C(const C& a) {};

    C(const A& a) {};
    C(const B& a) {};
    C(const D& a) {};

/* ... */
};

}; // NS END

D.h

#include "A.h"
#include "B.h"
#include "C.h"

namespace NS {

class A;
class B;
class C;

class D {

/* ... */

    D(const D& a) {};

    D(const A& a) {};
    D(const B& a) {};
    D(const C& a) {};

/* ... */
};

}; // NS END

Что бы я ни пытался, у меня есть некоторые ошибки от конструкторов, принимающих в качестве классов аргументов в других файлах, даже если они помещают объявление вперед, кажется, что оно принимает его как объявление и определение и игнорирует реальное определение, которое находится в другом файле. Как я мог решить это?

ПРИМЕЧАНИЕ: в каждом файле я определил охрану, просто я не поместил его здесь

Ответы [ 3 ]

4 голосов
/ 23 марта 2012

если вы удалите все #include в заголовках и поместите их в исходные файлы, все должно скомпилироваться.

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

Вы также можете добавить отдельный заголовок forward.h, содержащий объявления, вместо того, чтобы повторяться везде:

namesapce NS
{
  class A;
  class B;
  class C;
  class D;
}

Теперь создайте A.h, B.h и т. Д. #include forward.h, и вам больше не нужны предварительные объявления в каждом заголовке.

0 голосов
/ 23 марта 2012

Кроме того, всегда полезно добавить защиту #include следующим образом:

# ifndef _INCLUDED_A_H #define _INCLUDED_A_H

.... <вот обычное содержимое вашегозаголовочный файл> ....

# endif

Но главное, как указал Стийн, когда у вас есть предварительные декларации, вам не нужно также включать полные определения.

0 голосов
/ 23 марта 2012

жду деклараций!Если вы не используете методы классов, предварительные объявления могут помочь вам распутать зависимости.

http://www -subatech.in2p3.fr / ~ photons / subatech / soft / carnac / CPP-INC-1.shtml

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