c++先前定义错误
C++ previous definition error
所以,感谢这个网站,我找到了我之前问题的答案。我正在向GNU automake项目中的类添加一个函数,该项目使用指向doc
对象的指针。依赖项包含在Makefile中。将doc.h
和plsa.h
按各自的顺序包含在文件中。然而,当我编译时,我会得到一个doc has not been declared
错误。然后,我尝试在这里添加#include语句,这给出了一个previous redefinition of 'class doc'
错误。
我知道我必须通过使用下面注释掉的class doc;
行来声明doc
;但是,我认为只有在声明一个按值传递对象的函数时才需要这样做。有人能给我解释一下为什么#include在这种情况下是不正确的吗?
#include "doc.h"
//class doc;
class plsa {
// ...
int infer(doc *trset, int maxiter, double noiseH);
}
为什么重定义错误?
请确保你的头文件有适当的头保护/包括保护。很可能您错过了添加头保护,因此由于多次包含头而导致多个类定义。
为什么前向声明在这种情况下是可以的?
当不包含头文件时,添加以下行:
class doc;
它正向声明类doc
,这意味着对于编译器来说,它是一个不完整类型。对于不完全类型,我们不能创建它的对象,也不能做任何需要编译器知道doc
的布局或doc
只是一个类型的事实之外的事情。例如:编译器不知道它的成员是什么以及它的内存布局是什么。
但是,由于指向所有对象的指针需要相同的内存分配,因此,当仅将不完整类型引用为指针时,可以使用forward声明。
在这种情况下,doc
被引用的唯一方式是指向类doc
的指针,因此Forward声明也将起作用。
底线:
包括头文件应该为您工作,如果您有适当的包含保护到位。这并没有什么问题。
但是,由于上面给出的理由,向前声明类也应该适用。注意,前向声明通常用于类之间存在循环依赖的情况。
Include header File
和Forward Declaration
哪个更好?
包含头文件只是将代码从头文件复制粘贴到包含该文件的任何地方,这基本上可以导致:
- 增加编译时间
- 全局命名空间污染。
- 预处理器名称可能冲突。
- 增加二进制大小(在某些情况下,但并非总是如此)
前向声明对于如何进一步使用不完整类型有自己的限制。
对于不完整类型,您可以:
- 声明成员为指针或对不完整类型的引用。
- 声明接受/返回不完整类型的函数或方法。
- 定义接受/返回指向不完整类型的指针/引用的函数或方法(但不使用其成员)。
对于不完整类型,不能:
- 使用它作为基类。
- 用来声明一个成员。 使用此类型定义函数或方法。
考虑到可能性(由于上述对不完整类型使用的限制),我们应该选择前向声明而不是include Header。
您缺少包括监护人。如果您只是包含文件,它们只是粘贴,您需要确保当它们被多次包含时,它们在其他时候代码没有重复。所以你可以使用这样的结构:
#ifndef _XXX_
#define _XXX_
/* your header here */
#endif
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 使用命名空间时出现多个定义错误
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 在运算符重载定义中使用成员函数(const错误)
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在C++中使用内联方法时出现未定义的符号错误
- 已定义函数时出现 G++ "未定义的引用"错误
- C++ G++ 编译器 - 错误:隐式声明的定义
- 链接 cmake 时出现未定义的引用错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 错误:未定义对'oboe::AudioStreamBuilder::openStream(oboe::AudioStream**)'的引用
- 链接阶段出现多重定义错误
- 已经以性格错误定义了
- vim ctag导致了对乐趣的错误定义
- C++ 隐式声明的编译器错误定义
- 编译器错误-定义问题.C++