0

我有这个我正在处理的 C++ 项目。

所有类的实现都与 .h 文件分开。

但是,我不确定为什么/何时需要前向声明。

例如,我刚刚在#included "ClassType.h" 时遇到了一个错误,编译器完全拒绝编译具有指向 ClassType 的指针的类,即使在 "ClassType.h"中明确定义了类 ClassType。

为什么编译器仅仅看到我已经#included“ClassType.h”还不够,为什么它需要前向声明?

#include "ClassType.h"

// REFUSES TO COMPILE WITHOUT forward declaration
class ClassType;

class SomeClass
{
    ClassType* instance;
};
4

8 回答 8

7

ClassType.h 是否包括(直接或间接)您引用的文件,您在其中定义 SomeClass?

于 2009-07-06T22:13:21.920 回答
3

我想知道 ClassType 是否在命名空间中声明。需要查看 ClassType.h 才能确定。

于 2009-07-06T22:17:15.393 回答
3

听起来你有相同的头后卫。检查在标题的开头,你没有这样的东西

#ifndef SOMECLASS_H

这两个文件中。这些保护必须在他们保护的每个头文件中都有唯一的名称,以免被多个包含。否则,它们将阻止将内容包含到其他标头中。

于 2009-07-06T22:24:01.230 回答
2

什么时候需要提前申报?

当您只需要声明一个指向类型的指针时需要它,即在头文件中。实际的实现是完全不相关的,应该只在使用该类的任何方法或状态的 .cpp 文件中需要。

只要复制指针,类型就无关紧要,因为您只是复制指针值,而不是指针指向的内容。

// someclass.h
class ClassType;

class SomeClass
{
  public:
    void foo();
    ClassType* instance;
};

// someclass.cpp
void SomeClass::foo()
{
    instance->SomeMethod();  // someclass.h needed
    SomeFunction(instance);  // someclass.h irrelevant
}

干杯

如果这不起作用,您可能对 someclass.h 有一些问题

于 2009-07-06T22:25:12.507 回答
0

ClassType 可能存在问题,而不是 SomeClass。请发布 ClassType.h 的列表,我相信社区将能够为您提供帮助。:)

于 2009-07-06T22:13:40.547 回答
0

如果您使用前向声明以使编译正常工作,那么 ClassType.h 有一些东西会使您的 ClassType 定义无法进入编译的预处理源。尝试编译,以便它留下预处理文件,看看你能在那里找到什么。

于 2009-07-06T22:20:23.890 回答
0

通常,如果编译器没有看到他试图使用的声明,则您需要在任何编译单元中进行前向声明。这意味着您需要前向声明

  • 如果你有循环依赖
  • 如果标头没有正确声明您尝试使用的类(函数、变量)。

包含头文件不会做任何声明——它只是包含一个文件,并且该文件很可能是空的(或者由于双重包含保护损坏而变为空,如果您从另一个文件复制头文件并忘记调整用于双重包含保护的宏)。

在你的情况下,我敢打赌ClassType.h文件有问题。如果它确实声明了该类,我的猜测是双重包含保护。

于 2009-07-06T22:20:46.087 回答
0

如果它是一种头卫

#ifdef SOMECLASS_H

那么最好#pragma once改用

于 2009-07-06T22:27:40.550 回答