1

我有太多代码要发布,但我不断收到重复的编译错误,即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
4

1 回答 1

1

一个头文件在每个编译单元中只能包含一次,以避免重复定义。这是通过#ifdefs 或其他解决方案完成的。

如果您有相互依赖的标头,您将获得一个头文件循环,这会导致您在问题中提到的那种错误。

这是一个示例(我只是#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.cppa.h首先包含。首先要做的a.h是包含b.h. b.h然后尝试包含a.h,但它将被忽略,因为它已经包含在内。当 B 类被解析时,它找不到A,因为我们还没有走那么远a.h

一种解决方案是在头文件中使用指针(如果可能)。

头文件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;
}
于 2013-10-25T21:23:24.920 回答