如何访问静态void *函数内的私有成员

时间:2013-06-07 10:31:37

标签: c++ boost pthreads

文件: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 ++的新手。所以任何输入都会受到高度赞赏

4 个答案:

答案 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) );
}