2012-04-05 32 views
5

Tôi đang cố gắng triển khai khóa Mutex trên một trong các hàm tĩnh của lớp đơn tấn. Nhưng nhận được lỗi này:Nhận ‘m_Mutex’ được khai báo là tham chiếu nhưng không phải lỗi được khởi tạo

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

Đây là đoạn mã của tôi.

======== 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. 


} 

Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn, Yuvi

Trả lời

12

Đây thực sự là một biến thể của sự cố "phân tích cú pháp khó xử nhất". Bạn đã không được định nghĩa một m_Mutex bất cứ nơi nào trừ khi được một thành viên của MutexImplementation, vì vậy ngoài MutexImplementation, tên của nó là MutexImplementation::m_Mutex (và vì nó là tư nhân, bạn không thể truy cập vào nó hợp pháp). Khi bạn viết:

LockBlock (&m_Mutex); 

, trình biên dịch không thể tìm thấy m_Mutex, và do đó giả định rằng bạn đang xác định một biến địa phương. Các dấu ngoặc đơn là hợp pháp, nhưng không có có hiệu lực, và tuyên bố là giống như:

LockBlock& m_Mutex; 

Một tham chiếu đến LockBlock, và tài liệu tham khảo chỉ có thể được xác định nếu họ được khởi tạo.

Nếu bạn muốn có biến cục bộ, bạn sẽ phải đặt tên cho nó. Và nếu bạn muốn nó khởi tạo m_Mutex, bạn sẽ cần phải thực hiện m_Mutex công cộng, và chỉ định tên lớp cũng như:

LockBlock& localRefToMutex(&MutexImplementation::m_Mutex); 

ví dụ.

+0

khi tôi sử dụng 'LockBlock & localRefToMutex (& MutexImplementation :: m_Mutex);' M nhận 'khởi tạo không hợp lệ tham chiếu không const của loại 'LockBlock &' từ tạm thời kiểu 'pthread_mutex_t *'' nhưng khi tôi sử dụng 'LockBlock localRefToMutex (& MutexImplementation :: m_Mutex); 'nó đang được biên dịch đúng cách. – Yuvi

+0

Tôi đã không vượt quá cú pháp trong khi thực hiện chỉnh sửa. Ngữ nghĩa cũng được tính: 'localRefToMutex' nghĩa là gì? Biểu thức '& MutexImplementation :: m_Mutex' không có kiểu' LockBlock', và thậm chí nếu nó đã làm, nó không phải là một lvalue, vì vậy nó không thể được sử dụng để khởi tạo một tham chiếu đến một 'LockBlock'. –

Các vấn đề liên quan