0

文件: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 );
}

现在在 KeepAlive 我试图寻找更新的值

void * Service::KeepAlive(void* arg)
{
    boost::unordered_map<std::string,int>::iterator itrDummy;
    itrDummy = m_mapModuleType2FD.find("AK"); --- Line 420
}

我在哪里得到错误

错误:第 420 行 .invalid use of member 'Service::m_mapModuleType2FD' in static member function

我对 C++ 有点陌生 ..所以任何输入都会受到高度赞赏

4

4 回答 4

3

在类中声明的函数static不与该类的任何实例相关联(即this在其主体中没有可访问的指针)。

因此,您不能访问任何非静态成员变量(无论是私有的、受保护的还是公共的,都没有关系)。

要么让你的函数非静态(并在你的类的实例上调用它),要么让你的函数成为boost::unordered_map静态的。

(因为我不知道你真正想做什么,你必须弄清楚哪种方法适合你的需要)

于 2013-06-07T10:34:44.910 回答
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这将是 class 的每个实例共享的相同引用CExtIOService。也就是说,从一个实例修改它会更改您拥有的所有实例的映射。

这取决于你的计划是什么...

于 2013-06-07T10:36:57.050 回答
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) );
}
于 2013-06-07T11:06:10.380 回答
0

您可以将实例作为参数传递给静态成员:

class Service
{
public:
     typedef boost::unordered_map<std::string,int> map_t;
private:
     map_t m_mapModuleType2FD;
     void ProcessRequest();


public:
     static void* KeepAlive(Service* this_, void* arg); // fake this pointer
     map_t* getMap() { return m_mapModuleType2FD; }
};

// ....
void * Service::KeepAlive(Service* this_, void* arg)
{
    map_t::iterator itrDummy = this_->getMap()->find("AK");
                             //^^^^^^^^^^^^^^^^^
}

并这样称呼它:

Service instance;
Service::KeepAlive(&instance, argument);
于 2013-06-07T10:47:06.690 回答