文件:Service.hpp
class Service
{
private:
boost::unordered_map<std::string,int> m_mapModuleType2FD;
void ProcessRequest();
public:
static void* KeepAlive(void* arg);
};
文件:Service.cpp:
在功能处理请求中,我更新地图
void Service::ProcessRequest()
{
m_mapModuleType2FD["ak"] = 1;
LaunchKeepAlive();
}
void Service::LaunchKeepAlive()
{
pthread_create( & m_ptKeepAliveThreadID, NULL, Service::KeepAlive, NULL );
}
Now Inside KeepAlive我试图寻找更新的值
void * Service::KeepAlive(void* arg)
{
boost::unordered_map<std::string,int>::iterator itrDummy;
itrDummy = m_mapModuleType2FD.find("AK"); --- Line 420
}
我得到的地方和错误
错误:第420行。静态成员函数中使用成员'Service :: m_mapModuleType2FD'无效
我是C ++的新手。所以任何输入都会受到高度赞赏
答案 0 :(得分:3)
一个类中声明为static
的函数与该类的任何实例都没有关联(即在其正文中没有this
指针可用。)
因此,您无法访问任何非静态成员变量(无论是私有的,受保护的还是公共的,都无关紧要)。
使您的函数非静态(并在您的类的实例上调用它),或使boost::unordered_map
静态。
(因为我不知道你真正想做什么,你必须找出适合你需要的方法)
答案 1 :(得分:0)
如果您想从静态上下文访问m_mapModuleType2FD
,您还需要将此成员设置为静态:
class CExtIOService
{
private:
static boost::unordered_map<std::string,int> m_mapModuleType2FD;
void ProcessRequest();
public:
static void* KeepAlive(void* arg);
};
并静态访问:
itrDummy = CExtIOService::m_mapModuleType2FD.find(...);
可能不是您想要的,因为m_mapModuleType2FD
将是类CExtIOService
的每个实例共享的相同引用。也就是说,从一个实例修改它将改变你所有实例的地图。
这取决于你的计划......
答案 2 :(得分:0)
您可以将非静态实例作为参数传递给静态成员
class CExtIOService
{
public:
typedef boost::unordered_map<std::string,int> map_t;
private:
map_t m_mapModuleType2FD;
void ProcessRequest();
public:
static void* KeepAlive(CExtIOService* ptr, void* arg);
map_t* getMap() { return m_mapModuleType2FD; }
};
// ....
void * CExtIOService::KeepAlive(CExtIOService* ptr, void* arg)
{
map_t::iterator itrDummy;
itrDummy = ptr->getMap()->find("AK");
//^^^^^^^^^^^^^^^
}
但是您必须使用要操作的实例调用KeepAlive
。
CExtIOService instance;
CExtIOService::KeepAlive(&instance, argument);
或类似的......
答案 3 :(得分:0)
您的静态成员不属于该类的一个特定实例,没有this
指针可用。
这正是void* arg
的用途。您可以将this
指针走私到静态StaticKeepAlive(void*)
函数中,然后调用非静态RealKeepAlive()
函数:
class CExtIOService
{
private:
boost::unordered_map<std::string,int> m_mapModuleType2FD;
void ProcessRequest();
void RealKeepAlive();
static void* StaticKeepAlive(void* arg);
public:
void LaunchKeepAlive();
};
void CExtIOService::RealKeepAlive()
{
boost::unordered_map<std::string,int>::iterator itrDummy;
itrDummy = m_mapModuleType2FD.find("AK");
}
void *CExtIOService::StaticKeepAlive(void* arg)
{
CExtIOService* ptr = reinterpret_cast<CExtIOService*>(arg);
arg->RealKeepAlive();
return NULL;
}
void CExtIOService::LaunchKeepAlive()
{
pthread_create( & m_ptKeepAliveThreadID, NULL, CExtIOService::StaticKeepAlive,
reinterpret_cast<void*>(this) );
}