我正在研究这个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;
};
答案 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
代替