2012-04-27 24 views
0

C++でDVDレンタルアプリケーションを作成したいと思います。私は、顧客クラスの基礎と、CustomerDBという顧客のIDを保持する別のクラスを作成しました。各顧客には固有のIDがあります。
さらにプログラムに進む前にCustomerDBをテストしたいが、プログラムをコンパイルするときにエラーが発生する。ここで文字列とintのマップ

私が書いたコードです:

ヘッダファイル:

// DVD_App.h - Header File 

#include <string> 
#include <map> 

using namespace std; 

enum Status {ACTIVE, INACTIVE}; 

class Customer { 
    private: 
     string id; 
     string name; 
     string address; 
     Status status; 

    public: 
     Customer (const string&, const string&, const Status); 
     string &getId() { return id; } 
}; 

class CustomerDB { 
    private: 
     static map<string, int> idList; 

    public: 
     static void addNewToIdList (const string &threeLetterOfName) { 
      if (!doesThreeLettersOfNameExist(threeLetterOfName)) 
       idList.insert(pair<string, int>(threeLetterOfName, 0)); 
     } 

     static bool doesThreeLettersOfNameExist (const string &threeLetterOfName) { 
      map<string, int>::iterator i = idList.find(threeLetterOfName); 
      if ((i->first).compare(threeLetterOfName) != 0) 
       return false; 
      return true; 
     } 

     static int nextNumber (const string &threeLetterOfName) { 
      map<string, int>::iterator i = idList.find(threeLetterOfName); 
      ++(i->second); 
      return i->second; 
     } 
}; 

とソースコードファイル:

// DVD_App.cpp - C++ Source Code 

#include <iostream> 
#include <string> 
#include "DVD_App.h" 

using namespace std; 

Customer::Customer (const string &cName, const string &cAddress, const Status cStatus) : name(cName), address(cAddress), status(cStatus) { 
    string threeLetters = name.substr(0, 3); 
    if (CustomerDB::doesThreeLettersOfNameExist(threeLetters)) 
     threeLetters += "" + CustomerDB::nextNumber(threeLetters); 
    else { 
     CustomerDB::addNewToIdList(threeLetters); 
     threeLetters += "0"; 
    } 
} 

int main() { 
    Customer k ("khaled", "beirut", ACTIVE); 
    cout << k.getId() << endl; 

    return 0; 
} 

エラーイム取得は次のとおりです。

C:\Users\KiKo-SaMa\Desktop\C++>g++ DVD_App.cpp 
C:\Users\KIKO-S~1\AppData\Local\Temp\ccSsS5HX.o:DVD_App.cpp:(.text$_ZN10Customer 
DB14addNewToIdListERKSs[CustomerDB::addNewToIdList(std::basic_string<char, std:: 
char_traits<char>, std::allocator<char> > const&)]+0x59): undefined reference to 
`CustomerDB::idList' 
C:\Users\KIKO-S~1\AppData\Local\Temp\ccSsS5HX.o:DVD_App.cpp:(.text$_ZN10Customer 
DB27doesThreeLettersOfNameExistERKSs[CustomerDB::doesThreeLettersOfNameExist(std 
::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)]+0x1 
0): undefined reference to `CustomerDB::idList' 
C:\Users\KIKO-S~1\AppData\Local\Temp\ccSsS5HX.o:DVD_App.cpp:(.text$_ZN10Customer 
DB10nextNumberERKSs[CustomerDB::nextNumber(std::basic_string<char, std::char_tra 
its<char>, std::allocator<char> > const&)]+0x10): undefined reference to `Custom 
erDB::idList' 
collect2: ld returned 1 exit status 

wとは私のプログラムと一緒にロング?

答えて

7

静的変数idList(.hファイル内)を宣言しましたが、(.cppファイル内に)定義されていません

map<string, int> CustomerDB::idList; 
int main() { 
... 
} 
+1

ええ、cppファイルの1つです。クラス内の静的メンバーは単なる宣言であり、別の場所でインスタンス化する必要があります。 –

+0

Ohh、okay おかげでchacとAgent_L –

関連する問題