0

ファイル:Service.hpp

class Service
{
private:
         boost::unordered_map<std::string,int> m_mapModuleType2FD;
         void ProcessRequest();
public:
         static void* KeepAlive(void* arg);

};

ファイル:Service.cpp:

関数 Process Request でマップを更新します

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 行目。静的メンバー関数でのメンバー 'Service::m_mapModuleType2FD' の無効な使用

私はC ++にちょっと慣れていません..だから、どんな入力も高く評価されます

4

4 に答える 4

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_mapModuleType2FDclass のすべてのインスタンスで共有される同じ参照になるため、これはあなたが望むものではないかもしれませんCExtIOService。つまり、1 つのインスタンスから変更すると、取得したすべてのインスタンスのマップが変更されます。

それはあなたの計画が何であるかに依存します...

于 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 に答える