2012-07-26 6 views
6
class A { 
    public: 
     A(); 
    private: 
     pthread_mutex_t mu; 
}; 

A::A() 
{ 
    mu = PTHREAD_MUTEX_INITIALIZER; //cannot compile 
} 

क्या मैं कक्षा सदस्य फ़ंक्शन के अंदर pthread_mutex_t प्रारंभ नहीं कर सकता?सी ++ सदस्य फ़ंक्शन के अंदर PTHREAD_MUTEX_INITIALIZER संकलित नहीं कर सकता है?

+1

क्या आपको बताएंगे कि एक काम नहीं एक प्रारंभ है:

अपने मूल कोड में हम कुछ और बातें देख सकते हैं। – Flexo

+0

@ फ्लेक्सो, ओओपीएस, क्षमा करें। – Alcott

+0

माफी माँगने की कोई ज़रूरत नहीं है! – Flexo

उत्तर

7

इस मामले में pthread_mutex_init का उपयोग करें, क्योंकि स्थिरता संकलन-समय प्रारंभिकरण के लिए है।

+0

केवल 'स्थिर pthread_mutex_t' के लिए? – Alcott

+0

फिर मैं प्रारंभिक सूची में 'pthread_mutex_t' डेटा सदस्य नहीं डाल सकता, क्या मैं कर सकता हूं? – Alcott

+0

क्षमा करें, मेरा मतलब संकलन-समय प्रारंभिक था, स्थिर प्रारंभिक नहीं। और हां, आप प्रारंभिक सूचियों में इसे या तो नहीं डाल सकते (कम से कम अगर C++ 11 में नहीं)। –

10
इसके बजाय इस बात का

:

A::A() 
{ 
    mu = PTHREAD_MUTEX_INITIALIZER; //cannot compile 
} 

इस प्रयास करें:

A::A() 
{ 
pthread_mutex_init(&(mu), NULL); 
} 

PTHREAD_MUTEX_INITIALIZER किसी मैक्रो, {0,0,0,0,0 {0 की तरह कुछ के लिए एक सी struct प्रारंभकर्ता है }} और केवल परिभाषा के बिंदु पर उपयोग किया जा सकता है।

2

हम निर्माता यह अभी भी विफल रहता है में एक प्रारंभकर्ता सूची का उपयोग करने के लिए इसे बदल यहां तक ​​कि अगर:

#include <pthread.h> 

struct foo { 
    pthread_mutex_t test; 
    foo() : test(PTHREAD_MUTEX_INITIALIZER) {} 
}; 

int main() { 
    foo f; 
} 

हम देख सकते हैं क्यों यह विफल रहता है और एक ही को देखकर कुछ संदर्भों में initialisation लिए इस्तेमाल किया जा पूर्व processsor से उत्पादन:

struct foo { 
    pthread_mutex_t test; 
    foo() : test({ { 0, 0, 0, 0, 0, { 0 } } }) {} 
}; 

ऐसा में सी ++ 03 initialisation के लिए नेस्टेड ब्रेसिज़ उपयोग करने के लिए कानूनी नहीं है, लेकिन क्या अधिक दिलचस्प है शायद कि सी ++ 11 इस वाक्य रचना और पूरी तरह से कानूनी उपयोग करता है ।

A::A() 
{ 
    const pthread_mutex_t test = PTHREAD_MUTEX_INITIALIZER; // initialization - fine 
    mu = test; // assignment - fine 
    mu = PTHREAD_MUTEX_INITIALIZER; // assignment - C++11 only 
} 
+0

तो ओपी में मेरा कोड संकलित क्यों नहीं हो सकता है? – Alcott

+0

मूल कोड कानूनी C++ 11 भी है, शायद आपके पास आपके कंपाइलर में C++ 11 समर्थन सक्षम नहीं है। – Flexo

+0

इतने सारे सी ++ स्टडी हैं, मुझे उलझन में लग रहा है। – Alcott

संबंधित मुद्दे

 संबंधित मुद्दे