我遇到了包含模型實現和* .h和* .hpp文件的循環依賴包含模型的問題。循環依賴關係,標題和模板
讓我們想象一下班以下的繼承順序:
A->B->C,
A->A1,
B->B1, C->C1
其中A,A1是抽象類。
A.H(抽象類)
#ifndef A_H
#define A_H
template <class A>
{
//some code
virtual A() = 0;
};
#include "A.hpp"
#endif
A.hpp
#ifndef A_HPP
#define A_HPP
#include "B.h" //Circular dependency
#include "C.h" //Circular dependency
void create Object(A ** a, unsigned int code)
{
switch (code)
{
case 0: *a = new B(); break;
case 1: *a = new C();
};
}
#endif
B.h
#ifndef B_H
#define B_H
#include "A.h"
template <class T>
class B : public A <T>
{
//Some code
};
C.h
#ifndef C_H
#define C_H
#include "C.h"
template <class T>
class C : public B <T>
{
//Some code
};
A1.h(抽象類)
#ifndef A1_H
#define A1_H
#include "A.h"
template <class T>
class A1 : public A <T>
{
//Some code
};
#include "A.hpp"
#endif
A1.hpp
#ifndef A1_HPP
#define A1_HPP
#include "B1.h" //Circular dependency
#include "C1.h" //Circular dependency
void create Object(A1 ** a1, unsigned int code)
{
switch (code)
{
case 0: *a = new B1(); break;
case 1: *a = new C1();
};
#endif
B1.h
#ifndef B1_H
#define B1_H
#include "B.h"
template <class T>
class B1 : public B <T>
{
//Some code
};
C1.h
#ifndef C1_H
#define C1_H
#include "C.h"
template <class T>
class C1 : public C <T>
{
//Some code
};
如何做出合理包括避免循環依賴?我試圖取代包括與前向聲明指令,但不幸的是它是不夠的編譯器...
A.hpp
#ifndef A_HPP
#define A_HPP
template <class T>
class A;
template <class T>
class B;
//some code
#endif
1.hpp
#ifndef A1_HPP
#define A1_HPP
template <class T>
class A;
template <class T>
class B;
//some code
#endif
你應該使用前向聲明,可能的地方,而不是包括標題。我不能說你可以在哪裏替換包含前向聲明的指令,而不會看到你的代碼。 – 2011-02-03 17:33:57
[Two classes and inline functions]可能的重複(http://stackoverflow.com/questions/2233149/two-classes-and-inline-functions) – 2011-02-03 17:41:42