需求是:类A中使用B, 类B中使用A
常见错误用法
------------------------A.h---------------------
#ifndef HEADER_AAA
#define HEADER_AAA
#define HEADER_AAA
#include "B.h"
class A
{
public:
A(void);
virtual ~A(void);
private:
B b; //正确,因为此处已经知道B类的大小,且定义了B,可以为b分配空间
};
#endif
class A
{
public:
A(void);
virtual ~A(void);
private:
B b; //正确,因为此处已经知道B类的大小,且定义了B,可以为b分配空间
};
#endif
--------------------------A.cpp-----------------
#include "A.h"
A::A(void)
{
}
A::~A(void)
{
}
A::A(void)
{
}
A::~A(void)
{
}
---------------------------B.h---------------------
#ifndef HEADER_BBB
#define HEADER_BBB
#include "A.h"
class B
{
f iend class A; //error
public:
B(void);
virtual ~B(void);
A func(A g);
A g; //error
};
#endif
#define HEADER_BBB
#include "A.h"
class B
{
f iend class A; //error
public:
B(void);
virtual ~B(void);
A func(A g);
A g; //error
};
#endif
--------------------------B.cpp-----------------
#include "B.h"
B::B(void)
{
}
B::~B(void)
{
}
A B::Func(A g)
{
A o;
return o;
}
B::B(void)
{
}
B::~B(void)
{
}
A B::Func(A g)
{
A o;
return o;
}
经过VC编译发现,编译始终不过,error C2146: 语法错误 : 缺少“;”
原因:在预编译时,出现循环嵌套。(.h文件在cpp文件中替换)
比如在编译-A.cpp时的情况:
-----------A.cpp---------
#include "A.h" 替换
-------------------------
#ifndef HEADER_AAA
#define HEADER_AAA
-1111111111111111111111-
------------------------
#include "B.h" 替换
------------------------
#ifndef HEADER_BBB
#define HEADER_BBB
-222222222222222222222222-
------------------------
#include "A.h"
------------------------
#ifndef HEADER_AAA
#define HEADER_AAA
-------------------------
#include "B.h"--------循环。。。。
class A
{
public:
A(void);
virtual ~A(void);
private:
B b;
};
#endif
-22222222222222222222222-
class B
{
friend class A;
public:
B(void);
virtual ~B(void);
A func(A g);
A g;
};
#endif
-1111111111111111111111-
class A
{
public:
A(void);
virtual ~A(void);
private:
B b;
};
#endif
#include "A.h" 替换
-------------------------
#ifndef HEADER_AAA
#define HEADER_AAA
-1111111111111111111111-
------------------------
#include "B.h" 替换
------------------------
#ifndef HEADER_BBB
#define HEADER_BBB
-222222222222222222222222-
------------------------
#include "A.h"
------------------------
#ifndef HEADER_AAA
#define HEADER_AAA
-------------------------
#include "B.h"--------循环。。。。
class A
{
public:
A(void);
virtual ~A(void);
private:
B b;
};
#endif
-22222222222222222222222-
class B
{
friend class A;
public:
B(void);
virtual ~B(void);
A func(A g);
A g;
};
#endif
-1111111111111111111111-
class A
{
public:
A(void);
virtual ~A(void);
private:
B b;
};
#endif
正确用法:使用前置class X;
-----------------------A.h---------------------
#ifndef HEADER_AAA
#define HEADER_AAA
#define HEADER_AAA
#include "B.h"
class A
{
public:
A(void);
virtual ~A(void);
private:
B b;
};
#endif
class A
{
public:
A(void);
virtual ~A(void);
private:
B b;
};
#endif
--------------------------A.cpp-----------------
#include "A.h"
A::A(void)
{
}
A::~A(void)
{
}
A::A(void)
{
}
A::~A(void)
{
}
---------------------------B.h---------------------
#ifndef HEADER_BBB
#define HEADER_BBB
class A;
#define HEADER_BBB
class A;
class B
{
friend class A;
public:
B(void);
virtual ~B(void);
A func(A g);
A g;
};
#endif
{
friend class A;
public:
B(void);
virtual ~B(void);
A func(A g);
A g;
};
#endif
--------------------------B.cpp-----------------
#include "A.h"
#include "B.h"
B::B(void)
{
}
B::~B(void)
{
}
A B::Func(A g)
{
A o;
return o;
}
B::B(void)
{
}
B::~B(void)
{
}
A B::Func(A g)
{
A o;
return o;
}
比如在编译
-A.cpp时的情况:
#ifndef HEADER_AAA
#define HEADER_AAA
----------begin1-------
#include "B.h" --替换
---------------------
#ifndef HEADER_BBB
#define HEADER_BBB
class A;
class B
{
friend class A;
public:
B(void);
virtual ~B(void);
A func(A g);
A g;
};
#endif
--------End1----------
class A
{
public:
A(void);
virtual ~A(void);
private:
B b;
};
#endif
#define HEADER_AAA
----------begin1-------
#include "B.h" --替换
---------------------
#ifndef HEADER_BBB
#define HEADER_BBB
class A;
class B
{
friend class A;
public:
B(void);
virtual ~B(void);
A func(A g);
A g;
};
#endif
--------End1----------
class A
{
public:
A(void);
virtual ~A(void);
private:
B b;
};
#endif
比如在编译
-B.cpp时的情况:
--------------------------B.cpp-----------------
-----------begin1------------
#include "A.h" 替换
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#ifndef HEADER_AAA
#define HEADER_AAA
-----------begin3------------
#include "B.h" 替换
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#ifndef HEADER_BBB
#define HEADER_BBB
class A;
class B
{
friend class A;
public:
B(void);
virtual ~B(void);
A func(A g);
A g;
};
#endif
-----------end3--------------
class A
{
public:
A(void);
virtual ~A(void);
private:
B b;
};
#endif
-----------end1-------------
-----------begin2------------
#include "B.h" 替换
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#ifndef HEADER_BBB
#define HEADER_BBB
class A;
class B
{
friend class A;
public:
B(void);
virtual ~B(void);
A func(A g);
A g;
};
#endif
-----------end2--------------
-----------begin1------------
#include "A.h" 替换
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#ifndef HEADER_AAA
#define HEADER_AAA
-----------begin3------------
#include "B.h" 替换
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#ifndef HEADER_BBB
#define HEADER_BBB
class A;
class B
{
friend class A;
public:
B(void);
virtual ~B(void);
A func(A g);
A g;
};
#endif
-----------end3--------------
class A
{
public:
A(void);
virtual ~A(void);
private:
B b;
};
#endif
-----------end1-------------
-----------begin2------------
#include "B.h" 替换
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#ifndef HEADER_BBB
#define HEADER_BBB
class A;
class B
{
friend class A;
public:
B(void);
virtual ~B(void);
A func(A g);
A g;
};
#endif
-----------end2--------------
此时,无循环嵌套出现。编译正常。
小结:相互使用时,注意不要相互#include "XXX"。