从另一个类访问静态成员函数

时间:2012-08-28 14:37:05

标签: c++

我在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:未解析的外部符号“public:static void __cdecl Timestream :: setRoomList(class std :: map,class std :: allocator&gt;,class RoomDescription,struct std :: less,class std: :allocator&gt;&gt;,class std :: allocator,class std :: allocator&gt; const,class RoomDescription&gt;&gt;&gt;)“(?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:错误LNK2001:未解析的外部符号“private:static class std :: map,class std :: allocator&gt;,class RoomDescription,struct std :: less,class std :: allocator&gt;&gt;, class std :: allocator,class std :: allocator&gt; const,class RoomDescription&gt;&gt;&gt; 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)

2 个答案:

答案 0 :(得分:3)

您需要添加:

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

Timestream.cpp,或者调用任何实现文件。

这将定义静态成员。在头文件中,您只能声明它。

答案 1 :(得分:2)

我猜测未解析的外部符号是roomList;这是错误消息中包含的重要信息。并且,假设roomList是在类定义中声明的静态成员。如果这些假设是正确的,那么错误的原因是代码没有roomList定义

通常,静态成员必须在类定义中声明,并在源文件中定义

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

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

这与从另一个类访问静态成员无关。如果您尝试从声明它的类中访问它,则会收到相同的错误。

编辑:从新发布的错误消息中,有两个缺少的名称:setRoomListroomList。请注意roomListTimestream的成员,必须这样定义,也就是说,它的定义必须包含Timestream::。如上所示,它只是一个全局数据对象,而不是Timestream的成员。 setRoomList的问题可能相同。