我有太多的代码要发布,但我不断收到重复的编译错误,在我的项目中无法识别类Orderbk
。
最奇怪的是Orderbk
中没有实际的编译错误(这可以理解地导致所有其他类都无法识别它)。
有人可以告诉我线索可能是错误的,因为我的编译器在Orderbk
内没有看到问题,但引用Orderbk
的每个类都报告未定义?
1>------ Build started: Project: FXDcr (Intel C++ 13.0), Configuration: Debug x64 ------
1> Derivative.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1> Orderbk getOrderbk();
1> ^
1>
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1>C:\DXDcr\FXDcr\Stk.h(35): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1> FXDcr.cpp
1> FXMsg.cpp
1> Fut.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1> Orderbk getOrderbk();
1> ^
1>
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1>C:\DXDcr\FXDcr\Stk.h(35): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1> Index.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1> Orderbk getOrderbk();
1> ^
1>
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1> Instr.cpp
1>C:\DXDcr\FXDcr\Stk.h(13): error : not a class or struct name
1> class Stock : public Instr {
1> ^
1>
1>C:\DXDcr\FXDcr\Stk.h(35): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1>C:\DXDcr\FXDcr\Mappings.h(31): error : identifier "Instr" is undefined
1> static unordered_map<string, boost::shared_ptr<Instr> > GetDictOfAllInstrs();
1> ^
1>
1> Main.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1> Orderbk getOrderbk();
1> ^
1>
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1> Mappings.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1> Orderbk getOrderbk();
1> ^
1>
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1> Order.cpp
1> Stock.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1> Orderbk getOrderbk();
1> ^
1>
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1> SIA.cpp
1>C:\DXDcr\FXDcr\Instr.h(29): error : identifier "Orderbk" is undefined
1> Orderbk getOrderbk();
1> ^
1>
1>C:\DXDcr\FXDcr\Instr.h(33): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
1>C:\DXDcr\FXDcr\Stk.h(35): error : identifier "Orderbk" is undefined
1> Orderbk orderbk;
1> ^
1>
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
编辑我的所有标题文件的格式为:
#ifndef CLASS_H
#define CLASS_H
class CLASS{
};
#endif
答案 0 :(得分:1)
头文件只能在每个编译单元中包含一次,以避免重复定义。这是通过#ifdef
或其他解决方案完成的。
如果您的标题相互依赖,则会出现一个标题文件循环,导致您在问题中引用的错误类型。
以下是一个示例(我只是使用#pragma once
来表明该文件只包含一次,可能无处不在):
标头文件a.h
#pragma once
#include "b.h"
class A {
B b_instance;
};
标头文件b.h
#pragma once
#include "a.h"
class B {
A a_instance;
};
代码文件program.cpp
#include "a.h"
#include "b.h"
编译program.cpp
时,首先会包含a.h
。 a.h
做的第一件事就是包含b.h
。 b.h
然后尝试包含a.h
,但它会被忽略,因为它已经包含在内。然后解析B类时,它找不到A
,因为我们还没有在a.h
中找到那么远。
对此的一个解决方案是在heeader文件中使用指针(如果可能)。
标头文件b.h
#pragma once
class A;
class B {
A *a_instance;
public:
int do_stuff();
};
使用class A
的这个前向定义,我可以使用它的指针,因为编译器总是知道它们的大小。但是,我不能a_instance = new A();
或使用A
的成员,这必须进入b.cpp
!
代码文件b.cpp
#include "a.h"
int B::do_stuff() {
a_instance = new A();
// Or this
A my_instance;
}