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 ==========

EDIT すべてのヘッダー ファイルの形式は次のとおりです。

#ifndef CLASS_H
#define CLASS_H
class CLASS{

};
#endif
4

1 に答える 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.cppと、a.h最初にインクルードされます。最初に行うことa.hは、 を含めることb.hです。b.hその後、 を含めようとしますa.hが、既に含まれているため無視されます。Aクラス B が解析されると、まだそこまで進んでいないため、クラス B を見つけることができませa.hん。

これに対する 1 つの解決策は、(可能であれば) ヘッダー ファイルでポインターを使用することです。

ヘッダーファイル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 に答える