错误2错误20:标识符" "未定义

时间:2014-05-04 05:32:31

标签: c++ undefined identifier

我无法发布任何实际代码,因为我正在使用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“未定义”。为什么呢?

3 个答案:

答案 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"