5

シングル トン クラスの静的関数の 1 つに Mutex ロックを実装しようとしています。しかし、このエラーが発生します:

$error:‘m_Mutex’ declared as reference but not initialized
$warning:warning: unused variable ‘m_Mutex’

これが私のコードスニペットです。

========Commondefines.h==========

/**
*@class LockBlock
*This class is used to provide Mutex Lock on thread.
*/
class LockBlock
{
    public:
        LockBlock(pthread_mutex_t *mutex)
        {
            lockMutex = mutex;
            pthread_mutex_lock(lockMutex);
        };


        ~LockBlock()
        {
            pthread_mutex_unlock(lockMutex);
            lockMutex = NULL;
        }


    private:
        pthread_mutex_t *lockMutex;
};

========MutexImplenation.h======

#include "CommonDefines.h"

class MutexImplementation
{

  private:
     static pthread_mutex_t m_Mutex ;

  public:
     static void commonFunction();

};

====MutexImplementation.cpp==========

// Initialize static member of class.
pthread_mutex_t MutexImplentation::m_Mutex = PTHREAD_MUTEX_INITIALIZER;


void commonFunction()
{
   LockBlock(&m_Mutex); // Here I am getting this error.


}

どんな助けでも大歓迎です。ありがとう、ユヴィ

4

1 に答える 1

12

これは、実際には「最も恥ずかしい解析」問題の変種です。m_Mutexのメンバー以外 の場所で を定義していないMutexImplementationため、 の外部ではMutexImplementation、その名前は です MutexImplementation::m_Mutex(プライベートであるため、合法的にアクセスすることはできません)。あなたが書くとき:

LockBlock (&m_Mutex);

、コンパイラは を見つけることができないためm_Mutex、ローカル変数を定義していると見なされます。括弧は有効ですが、効果はありません。宣言は次と同じです。

LockBlock& m_Mutex;

への参照LockBlock、および参照は、初期化されている場合にのみ定義できます。

ローカル変数が必要な場合は、名前を付ける必要があります。に初期化するm_Mutex場合は、m_Mutex公開し、クラス名も指定する必要があります。

LockBlock& localRefToMutex( &MutexImplementation::m_Mutex );

例えば。

于 2012-04-05T09:53:21.773 に答える