什么时候需要转发声明?

时间:2009-07-06 22:11:19

标签: c++ forward-declaration

我正在研究这个C ++项目。

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

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

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

为什么编译器不能简单地看到我已经#included“ClassType.h”,为什么它需要前向声明呢?

#include "ClassType.h"

// REFUSES TO COMPILE WITHOUT forward declaration
class ClassType;

class SomeClass
{
    ClassType* instance;
};

8 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

听起来你有同样的头部防守。检查标题开头是否有类似的内容

#ifndef SOMECLASS_H
两个文件中。这些警卫必须在每个头文件中都有唯一的名称,以防止多个内容。否则,它们将阻止将内容包含到其他标头中。

答案 3 :(得分:2)

  

何时是前方声明   需要?

只需要声明指向类型的指针,即在头文件中,就需要它。实际实现完全不相关,并且<。>文件

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

// 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的一些问题

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果您正在使用前向声明以使编译工作,那么ClassType.h会使您的ClassType定义无法进入已编译的预处理源。尝试编译,使其保留预处理文件并查看可以在那里找到的内容。

答案 6 :(得分:0)

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

  • 如果您有循环依赖
  • 如果标题未正确声明您尝试使用的类(函数,变量)。

包含头文件不会做任何声明 - 它只是包含一个文件,并且该文件可能非常空(或由于双重包含保护中断而变为空,如果从中复制头文件,这可能很容易发生另一个,忘了调整用于双重包含保护的宏。)

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

答案 7 :(得分:0)

以防它是一种

的头部防护
#ifdef SOMECLASS_H

然后最好使用#pragma once代替