2017-01-26 9 views
1

私はC++を初めて使い、すべてのソースファイルにアクセスできるマップを作成しようとしています。ここに問題のあるコードの簡略化されたバージョンがあります。すべてのヘッダーファイルにヘッダーガードがありますが、ここでは入力しませんでした。グローバルデータ構造にアクセスする

// main.cpp 

#include "client.hpp" 
int main(void){ 
    init(); 
    search(); 
} 


// util.cpp 

#include "util.hpp" 
std::map<int, STUDENT_TYPE> dataBase; 
init(){ 
    dataBase[0] = STUDENT_TYPE(14, 4.0); 
    // more students.... 
} 


// util.hpp 

#include <map> 

struct STUDENT_TYPE{ 
    int age; 
    int grade; 
    STUDENT_TYPE(int age, int grade) : age(age), grade(grade){} 

}; 
extern std::map<int, STUDENT_TYPE> dataBase; 



// client.cpp 
#include "client.hpp" 
void search(){ 
    std::cout << dataBase[0].grade << std::endl; 

} 



// client.hpp 
#include "util.hpp" 
void search(); 

問題は、コンパイラが検索機能でビルドできなかったことです。それは大きなエラーの連鎖を与えます。最後のエラーまたはすべてのエラーの原因は、STUDENT_TYPEのコンストラクタに2つのフィールドが必要な場合です。クライアントがdataBase内のSTUDENT_TYPE構造体にアクセスできないと思われます。私はそれをどうやって修正するか、それがどうなったか正確には分かりません。私は、プログラムのすべてのファイルにアクセスできる大きな生徒のテーブルが必要なだけです。

答えて

3

コンパイラは何が間違っているかを正確に伝えています。あなたの学生タイプはデフォルトコンストラクタを持っておらず、使用されています。

なぜ使用されていますか?

map::operator []は、デフォルトで構築されたインスタンスを作成し、そのキーにエントリがまだ存在しない場合に返すためです。これが起こらない場合でも、コンパイラはそのブランチをコンパイルしなければならず、ここではコンパイルできません。修正する

二つの方法:

  1. あなたの学生が有意義なデフォルトを入力与えます。
  2. map::operator[]を使用しないでください。代わりにmap::findを使用してください。
+0

ありがとうございました。最初の解決策が働いた!私はmap :: findをよく知っているわけではなく、もっと研究が必要です。再度、感謝します。 –

1

第1溶液;グローバルなデータ構造を持たない。通常、このようなことをする必要は全くありません。

第2に、ヘッダーファイルの本体がと同じ翻訳単位に含まれないようにします。ヘッダーファイルが複数の.cppファイルに含まれている場合、効果はありません。

第3に、ここで問題に関する質問を投稿するときは、取得しているエラーメッセージの全文を投稿してください。

+0

これは良いヒントかもしれませんが、私はそれらが彼のエラーに関連しているとは思いません。 –

+0

@Mikelおそらく、そうでないかもしれない - 彼は実際のコードを投稿していないので、私はいくつかの仮定をした。彼は、グローバル変数を持っていると言っています。 –

+0

グローバルデータ構造の代替に関する提案はありますか?私は新しいです、私はちょうどそれを適切に処理する方法を知らない。 –

関連する問題