2010-09-06 11 views
11

अंदर typedef शामिल यह मेरा शीर्षक है:एक वर्ग हैडर

#ifndef TIMING_H 
#define TIMING_H 

#define MAX_MESSAGES 1000 
typedef Message* MessageP; //inside the class? 

class Timing { 

public: 

Timing(); 

private: 

struct Message { 
    Agent *_agent; 
    double _val; 
}; 

MessageP* _msgArr; 
int _waitingMsgs; 


}; 

मेरा प्रश्न है: मैं ऊपर MessageP * _msgArr वर्ग ब्लॉक के अंदर typedef जगह है या यह ठीक यह सब के पास जगह है # परिभाषित?

यह संकलन त्रुटियों को आउटपुट नहीं करता है इसलिए मुझे इसके बारे में निश्चित नहीं है।

उत्तर

13

वर्ग के बाहर, उस प्रकार Timing::Message रूप

typedef Timing::Message* MessageP; 

के लिए भेजा जाना चाहिए, ताकि लेकिन यह केवल Timing::Message की घोषणा के बाद संभव है, फिर भी पहले Timing की घोषणा पूरा हो गया है MessageP, प्रयोग किया जाता है तो यह है संभव नहीं।

इसके अलावा, संरचना private: सदस्य है, इसलिए आप इसे किसी भी तरह से परिभाषित नहीं कर सकते हैं। typedefTiming कक्षा के अंदर किया जाना चाहिए।

class Timing { 

public: 

Timing(); 

private: 

struct Message { 
    Agent *_agent; 
    double _val; 
}; 

typedef Message* MessageP; // <-- 


MessageP* _msgArr; 
int _waitingMsgs; 


}; 

आप संकलन त्रुटि शायद नहीं मिला क्योंकि वैश्विक क्षेत्र में एक और Message प्रकार पहले से मौजूद।

+2

कोई आगे की घोषणा का उपयोग कर सकता है ताकि उसे कक्षा के अंदर न हो। – bobbymcr

+1

@ बॉबी: चूंकि यह 'टाइमिंग' पर निर्भर नहीं है, इसलिए इसे बिना किसी घोंसले और परिभाषित किया जा सकता है। बिना किसी घोंसले के वैश्विक स्तर पर इसे घोषित करने का कोई तरीका नहीं है। – Potatoswatter

+0

ओह, मुझे वह हिस्सा याद आया ... तो हाँ, मैं आपसे सहमत हूं। – bobbymcr

4

typedef को उस स्थान पर रखें जहां यह समझ में आता है।

शीर्ष पर रखकर इसका मतलब यह होगा कि आप वैश्विक नामस्थान क्षेत्र में उपनाम को इंजेक्ट करते हैं। इसे कक्षा के अंदर रखकर इसका अर्थ यह हो सकता है कि यह निकटतम पहुंच विनिर्देशक (या private यदि कोई नहीं है) के आधार पर केवल सदस्यों (और/या उप-वर्गों) के लिए देखने योग्य या देखने योग्य है।

यदि कक्षा के क्लाइंट को इस उपनाम के बारे में जानने की आवश्यकता नहीं है तो इसे निजी के रूप में चिह्नित करें।

यदि आप इसे कक्षा के अंदर रखते हैं: ध्यान दें कि कक्षा के बाहर आपको नाम को Timing::MessageP के रूप में पूरी तरह अर्हता प्राप्त करने की आवश्यकता होगी या अन्यथा using Timing::MessageP दायरे में निर्देश की आवश्यकता है। साथ ही, पूर्ण योग्यता केवल कक्षा के परिभाषित होने के बाद ही की जा सकती है (आप अधूरे प्रकारों के लिए उपनाम नहीं बना सकते हैं - आगे Timing घोषित नहीं करेगा)।

class Timing { 
    public: 
    Timing() {} 
    private: 

struct Message { 
    Agent *_agent; 
    double _val; 
}; 

MessageP* _msgArr; 
int _waitingMsgs; 

}; 

typedef Timing::Message* MessageP; // okay 
1

शीर्ष पर इसे ठीक करना ठीक है। हालांकि, यह उल्लेखनीय अन्य लोगों की तरह वैश्विक दायरे में डालने का एक अच्छा अभ्यास नहीं है।