2012-08-28 88 views
2

我在C++類中有一個靜態stl映射,並有另一個靜態成員函數來返回一個指向地圖中對象的常量指針。該映射對類中的所有對象都是通用的。從另一個類訪問靜態成員函數

唯一的問題是,我需要搜索此映射並將其從另一個類中進行設置,該類位於不同的.cpp/.h文件中,並且當我嘗試在vs2010中編譯它們時會得到未解析的外部符號。這些方法在Timestream類中定義爲

static void setRoomList(std::map<std::string, RoomDescription> rl); 
static RoomDescription * getRoom(std::string ref); 

這兩個函數都是公共的,所以應該沒有訪問問題。這些功能在Timestream.cpp文件即定義爲正常,

RoomDescription * Timestream::getRoom(std::string ref) 
{ 
    std::map<std::string, RoomDescription>::iterator cIter= roomList.find(ref); 

    if(cIter!=roomList.end()) 
     return &(cIter->second); 

    return NULL; 
} 

我試圖從其他類調用這個像

RoomDescription *r =Timestream::getRoom("Bathroom") 

。網上的其他帖子似乎談論使用extern,但我不確定。我不明白爲什麼這應該是從另一個類別調用任何其他成員函數有什麼不同?

謝謝, 詹姆斯

編輯: 是的,我已經聲明

std::map<std::string, RoomDescription> roomList; 

在Timestream.cpp文件的頂部。在頭它定義爲

static std::map<std::string, RoomDescription> roomList; 

我已經包括RoomDescription類中的我試圖調用這些方法的報頭中的標頭。

我得到的錯誤是這個

Import.obj:錯誤LNK2019:無法解析的外部符號「市民:靜態無效__cdecl Timestream :: setRoomList(類的std ::地圖,一流的std ::分配器> class RoomDictList,struct std :: less,class std :: allocator >>,class std :: allocator,class std :: allocator> const,class RoomDescription>>>)「(?setRoomList @ Timestream @@ SAXV?$ map @ V'$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@ VRoomDescription @@ U&$ @少V'$ basic_string的@ DU?$ char_traits @ d @ STD @ @V?$分配器@ d @ @@ 2 STD @@@ 2 @ V'$分配器@ U&$對@ $$ CBV?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ 2 @@ std @@ VRoomDescription @@@ std @@@ 2 @@ std @@@ Z)在函數「public:int __thiscall Import :: getRoomData(void) 「(?getRoomData @ Import @@ QAEHXZ)

Timestream.obj:error LNK2001:無法解析的外部符號」private:static class std :: map,class std :: allocator>,RoomDescription,struct std :: less, class std :: allocator>>,class std :: allocator,class std :: allocator> const,class RoomDescription>>> Timestream :: roomList「(?roomList @ Timestream @@ 0V?$ map @ V $ basic_string @ DU ?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@ VRoomDescription @@ U&$ @少V'$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@@ 2 @ V'$分配器@ U&$ @配對$$ CBV?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @ @VRoomDescription @@@ STD @@@ 2 @@ STD @@ A)

+3

可能您沒有在.cpp文件中定義roomList變量。無論如何,顯示確切的代碼和錯誤信息。 –

+0

可能重複(也許):http://stackoverflow.com/questions/7092765/what-does-it-mean-to-have-an-undefined-reference-to-a-static-member – Mankarse

+0

setRoomList定義在哪裏? –

回答

2

您需要添加:

std::map<std::string, RoomDescription> Timestream::roomList; 

Timestream.cpp,或者任何你的實現文件被調用。

這將定義爲的靜態成員。在頭文件中,你只有聲明它。

+0

對不起,是的,這正是我所做的。 – James

+0

@詹姆斯,所以你有這個,仍然得到錯誤? –

2

我猜測,無法解析的外部符號是roomList;這是錯誤消息中包含的重要信息。而且,據推測,roomList是在類定義中聲明的靜態成員。如果這些假設是正確的,那麼錯誤的原因是該代碼沒有定義roomList

一般情況下,靜態成員必須聲明在類定義定義在源文件:

// foo.h: 
class C { 
    static int data; 
}; 

// foo.cpp: 
int C::data = 42; 

這有沒有關係從另一個類訪問靜態成員。如果您嘗試從聲明它的類訪問它,您會得到相同的錯誤。

編輯:從新貼的錯誤消息,有兩個缺少的名字:setRoomListroomList。請注意,roomListTimestream的成員,必須定義爲這樣,也就是說,它的定義必須包含Timestream::。如上所示,它只是一個全局數據對象,而不是Timestream的成員。 setRoomList的問題可能是相同的。

相關問題