我无法发布任何实际代码,因为我正在使用PS3开发工具包而且源代码不允许公开发布,所以我会尽量解释我的问题,而不使用任何PS3具体代码。
说我有2个头文件(A.h和B.h)以及2个匹配的cpp文件(A.cpp和B.cpp)
A.h看起来与此相似
#ifndef A_H
#define A_H
#include "B.h"
class A
{
public:
void function1();
void functionA();
B m_b;
};
#endif
虽然B.h看起来像这样
#ifndef B_H
#define B_H
#include "A.h"
class B
{
public:
void function2();
void functionB();
A m_a;
};
#endif
这两个类都有其他功能需要使用相应的cpp文件,但我遗漏了。在A.cpp中,我需要使用A.h中的所有函数和B.h中的单个函数,并且在B.cpp中我需要使用B.h中的所有函数和来自A.h的单个函数
所以A.cpp目前看起来与此相似:
#include A.h
#include B.h
void function1()
{
code;
}
void functionA()
{
code;
m_b.function2();
}
和B.cpp看起来像
#include A.h
#include B.h
void function2()
{
code;
}
void functionB()
{
code;
m_a.function1();
}
现在显然有比这更多的代码,但这是我在编译时遇到问题的地方。我得到编译器错误“错误2错误20:标识符”“未定义”和匹配的“错误2错误20:标识符”B“未定义”。为什么呢?
答案 0 :(得分:2)
预处理器语法在""
指令中的文件名周围需要<>
或#include
。你为什么突然做
#include A.h
您的.cpp
文件中的.h
文件中的是否使用了正确的语法
#include "A.h"
???
在任何情况下,以循环方式将头文件相互包含在一起都不会有任何意义。
此外,您似乎试图让A
成为B
的成员,同时让B
成为A
的成员。你应该明白,这是一个无限嵌套的数据结构,实际上不可能存在。在C ++中不可能做这样的事情。
答案 1 :(得分:0)
此代码存在许多问题。 (显然,cpp文件中的#include
语法是错误的,正如已经指出的那样。)
您的A
对象包含B
,您的B
包含A
,其中包含B
,其中包含A
,其中包含{ B
......我想你明白了。
您需要至少使用指针或引用中的一个。然后你需要使用前向声明让编译器知道B
是一个类:
// A.h
class B;
class A {
// ...
B * m_b;
};
// B.h
#include "A.h"
class B {
// ...
A m_a;
};
请注意,该通告包括不胜任务。包含守卫确保预处理器不会进入无限循环,但是首先出现的类不会知道其他类是什么。
您的cpp代码似乎也错误地定义了类成员 - 它应该是:
void B::function2(){
//code
}
等等。
答案 2 :(得分:-2)
使用类预先声明如下:
在档案A.h:
class B;
class A
{
...
private:
B m_b;
};
在档案B.h:
class B
{
...
private:
A m_a;
};
在所有cpp文件中,在A.h。
之后总是包括B.h.#inlcude "A.h"
#inlcude "B.h"