2011-06-07 23 views
16

MSDN के अनुसार typedef वाक्य रचना है:typedef वाक्य रचना

typedef प्रकार-घोषणा पर्याय;

बहुत आसान:

typedef int MY_INT; 

लेकिन कैसे हो सदस्य-समारोह-सूचक typedefs इस नियम के अनुपालन करता है?

typedef int (MyClass::*MyTypedef)(int); 

100% भ्रम - समानार्थी (MyTypedef) बीच में है?

क्या कोई व्यक्ति कृपया बता सकता है कि एमएसडीएन के सिंटैक्स प्रारूप को समझने के लिए कितना आसान तार्किक कदम प्राप्त करना है, जो टाइपेडफ के ऊपर/यादृच्छिक/सामने/आखिरी/मिश्रित सिंटैक्स चीज के लिए है? सभी तेजी से जवाब (और मेरी पोस्ट के सौंदर्यीकरण) :)

+8

ऐसा नहीं है - एमएसडीएन गलत है। –

+1

हाँ, एमएसडीएन गलत है। 'int typedef MY_INT' का एक ही अर्थ है! – ybungalobill

उत्तर

28

पर्याय (MyTypedef) बीच में है ??

यह मध्य में नहीं है। बस थोड़ी देर के लिए सदस्य-समारोह भूल जाते हैं, देखते हैं कि कैसे एक समारोह सूचक परिभाषित किया गया है:

int (*FuncPtr)(int); 

और यह आप इसे कैसे typedef होता है:

typedef int (*FuncPtr)(int); 

सरल! केवल अंतर यह है कि टाइपपीफ FuncPtr में प्रकार बनता है, जबकि सूचक घोषणा में, FuncPtrपरिवर्तनीय है।

इसी तरह,

int (MyClass::*MyTypedef)(int); //MyTypedef is a variable 

और जैसा कि typedef:

typedef int (MyClass::*MyTypedef)(int); //MyTypedef is a type! 
+1

मुझे लगता है कि '*' की स्थिति भ्रमित करने वाला हिस्सा है, इसलिए यह याद रखना उचित हो सकता है कि उपसर्ग "घोषणा ऑपरेटर" सही-सहयोगी हैं, इसलिए घोषणा का मूल्यांकन किया जाता है "MyTypedef एक 'सूचक-से'' MyClass का 'फ़ंक्शन लेना int '" आदि – davka

9

के लिए

* धन्यवाद संपादित कैसे आप सदस्य कार्य करने के लिए एक सूचक परिभाषित करते हैं? इस तरह:

int (A::*variableName)(int); 

यह एक typedef करने के लिये एक typedef जोड़ें:

typedef int (A::*typedefName)(int); 
3

C++ घोषणा के लिए सिद्धांत है कि वे उपयोग mimick है। आप सदस्य समारोह PMF के लिए सूचक का उपयोग करना चाहते हैं, तो आप लिखेंगे:

(myVar.*pmf)(arg); 

तो इसके लिए एक typedef परिभाषित करने के लिए, आपके द्वारा लिखी:

typedef int (MyClass::*pmf)(int); 

, सिर में वापसी प्रकार जोड़ने की जगह उनके प्रकार से प्रकार और तर्क द्वारा परिवर्तनीय।

+0

+1 यह है कि मैं उन्हें कैसे समझता हूं! दुर्भाग्यवश हमेशा लागू नहीं किया जा सकता है (उदा। संदर्भ)। – ybungalobill

+0

"(myVar। * Pmf) (arg) का उपयोग करने का कोई तरीका है;" "myVar" ऑब्जेक्ट के बिना? – pBlack

1

मैं एक बार एक अच्छी व्याख्या पढ़ना (लेकिन यह तो मैं YMMV Expect C Programming से है):

वास्तव में, एक typedef एक चर घोषणा के रूप में वास्तव में ही स्वरूप है, केवल इस अतिरिक्त कीवर्ड के साथ टिप आप बंद हैं।

चूंकि टाइपिफ़ एक परिवर्तनीय घोषणा की तरह दिखता है, तो यह बिल्कुल एक जैसा पढ़ा जाता है। इसके बजाय घोषणा करते हुए कहा, "इस नाम घोषित प्रकार का एक चर के लिए संदर्भित करता है," typedef कीवर्ड एक चर पैदा नहीं करता है, लेकिन कहते हैं "इस नाम कहा के लिए एक पर्याय है घोषणा का कारण बनता है की प्रकार।"

तो आपके पास यह है। कल्पना करें कि आप एक चर घोषित कर रहे हैं, typedef इससे पहले और voila, आपके पास एक नया प्रकार है। MSDN स्पष्टीकरण एक मिश्रित बैग हैं: मैंने वास्तव में ईश्वर को और सीधे बुरे लोगों को पढ़ा है।

1

जिस पृष्ठ का आप उल्लेख कर रहे हैं वह शायद "typedef Specifier" है। सरल "typedef type-declaration synonim;" सिंटैक्स टाइपपीफ का उपयोग करने के कई तरीकों में से एक है। टाइपिफ़ का उपयोग कैसे किया जा सकता है इसका वर्णन करने के लिए (संभवतः) कोई सरल और संक्षिप्त तरीका नहीं है। यही है कि "Typedef Declarations" एमएसडीएन पृष्ठ के लिए है।

आप की तरह यह पेज कुछ पर ध्यान देंगे: के रूप में क्या घोषणा-विनिर्देशक और init-declarator-सूची here पाया जा सकता है के लिए

declaration: 
    declaration-specifiers init-declarator-list opt ; 
declaration-specifiers: 
    storage-class-specifier declaration-specifiers opt 
    type-specifier declaration-specifiers opt 
    type-qualifier declaration-specifiers opt 
storage-class-specifier: 
    typedef 

अधिक जानकारी।

"टाइपिफ़" के लिए सभी संभावित उपयोगों को समझने का यह एक कठोर तरीका है।

यह पृष्ठ मूल रूप से कहता है कि "टाइपिफ़" का उपयोग सबसे वैध घोषणाओं से पहले किया जा सकता है।

0

यह समझना महत्वपूर्ण है कि जब आप इस तरह सोचना शुरू आसान हो जाएगा:

जब भी आप इस तरह एक समारोह देखें:

TYPE foo(int arg1, int arg2); 

आप कहते हैं कि foo के प्रकार के प्रकार है। तो,

int get_next_prime(); 

का प्रकार int है।

आप देख सकते हैं कि जब आप एक समारोह के लिए एक तर्क के रूप में एक समारोह सूचक पारित:

void register_callback(void (*ptr)(int)); 

इस मामले में, आप एक तर्क के रूप प्रकार शून्य के एक समारोह से गुजर रहे हैं।

अब

, जब आप ऐसा ही कुछ देखें: अगर आप अभी कह रहे हैं

typedef int (A::*typedefName)(int); 

कि चर (ए :: * typedefName) (int) (यह केवल एक ही बात है, नहीं दो है, क्योंकि यह एक है फ़ंक्शन पॉइंटर घोषणा) वास्तव में प्रकार int है।तब से, कंपाइलर ए :: * typedefName को प्रकार int के फ़ंक्शन के रूप में व्याख्या करेगा, यानी, यह एक int मान देता है।

आशा है कि यह इसे कम भ्रमित कर देगा।

+0

पूछने के लिए खेद है, लेकिन उपर्युक्त स्पष्टीकरण सही है? मुझे यह कहना मुश्किल लगता है कि get_next_prime का प्रकार int है। –

4

मुझे पता है कि आपको पहले ही आपका जवाब मिल गया है, लेकिन इसे साझा करना चाहते हैं - यह आसान है: http://www.cdecl.org। यह एक सी/सी ++ घोषणा < -> अंग्रेजी अनुवादक है। बस वर्ग एक समारोह (int) लौटने चार

और आप char (A::*x)(int) पाने के सदस्य के सूचक के रूप में में

घोषित x टाइप करें। या घोषणा के साथ खेलें और देखें कि क्या आप चाहते हैं कि आप क्या चाहते हैं।

9

यह ध्यान देने योग्य है कि, सी ++ 11 के रूप में, आप एक अधिक सुपाठ्य using बयान के रूप में इस अभिव्यक्ति लिख सकता है लायक है:

using MyTypedef = int (MyClass::*)(int); 
1

की वाक्य रचना का उपयोग करते हुए सदस्य समारोह सूचक है करने के लिए (a मान वर्ग A का एक उदाहरण है):

  • घोषणा में, का उपयोग करें " ए :: "उपसर्ग
  • के रूप में इसका उपयोग करते समय," ए "का उपयोग करें। उपसर्ग

नीचे एक खिलौना उदाहरण है। आप इसके साथ खेल सकते हैं।

#include <stdio.h> 
#include <stdlib.h> 
class A; 
typedef int (A::*F)(double); 

class A { 
public: 
    int funcDouble(double x) { return (int)(x * 2.0); } 
    int funcTriple(double x) { return (int)(x * 3.0); } 

    void set(int a) { 
    if (a == 2) { 
     this->f_ = &A::funcDouble; 
    } else if (a == 3) { 
     this->f_ = &A::funcTriple; 
    } else { 
     this->f_ = NULL; 
    } 
    } 

public: 
    F f_; 
}; 
int main(int argc, char *argv[]) { 
    A a; 
    a.set(2); 
    F f = &A::funcDouble; 
    printf("double of 1 = %d\n", (a.*f)(1)); 

    // Below is equivalent to: 
    // F f2 = a.f_; 
    // printf("double of 1 = %d\n", (a.*f2)(1)); 
    printf("double of 1 = %d\n", (a.*(a.f_))(1)); 

    a.set(3); 
    printf("triple of 1 = %d\n", (a.*(a.f_))(1)); 

    return 0; 
} 
संबंधित मुद्दे