2011-02-08 14 views
5

मैं अपने विश्वविद्यालय परियोजना के लिए डर एसडीके को देखकर किया गया है, लेकिन इतना जैसे कुछ कोड पर ध्यान दिया है:एक हेडर और आगे एक ही सीपीपी फ़ाइल में निहित कक्षा घोषित क्यों करें?

Foo.h

class Foo 
{ 
    public: 
     int iSomething; 
}; 

Bar.cpp:

#include "Foo.h" 

// Forward declarations 
class Foo; 

है घोषित करने और उसी सीपीपी फ़ाइल में उचित शीर्षलेख शामिल करने के लिए कोई विशेष कारण है? या आगे की घोषणा अनावश्यक है क्योंकि हेडर शामिल किया जा रहा है?

संपादित करें:

हर बार है कि मैं कोड में यह देखा है, को शामिल बयान आगे घोषणा से पहले हमेशा होता है।

उत्तर

6

यह केवल अनावश्यक से अधिक है, यह संभावित रूप से समस्याग्रस्त है। Foo.h परिवर्तनों को बताएं ताकि फू सामान्य, टेम्पलेटिज्ड समकक्ष के कुछ विशेष तत्कालता के लिए एक टाइपपीफ बन जाए - ऐसी चीज जिसे सामान्य सॉफ़्टवेयर विकास के हिस्से के रूप में अनुमानित किया जा सकता है। तब Bar.cpp की 'दसवीं कक्षा "बेकार में एक संकलन त्रुटि आला कारण होगा:

--- fwd.h --- 
template <typename T> 
class XT 
{ 
    public: 
    int n_; 
}; 

typedef XT<int> X; 

--- fwd.cc --- 
#include "fwd.h" 

class X; 

int main() 
{ 
    X x; 
    x.n_ = 0; 
    return x.n_; 
} 

--- compilation attempt --- 
~/dev .../gcc/4.1.1/exec/bin/g++ fwd.cc -o fwd 
fwd.cc:3: error: using typedef-name 'X' after 'class' 
fwd.h:8: error: 'X' has a previous declaration here 

यह भी एक कारण मैं हमेशा उपयोग करने की अनुशंसा, आगे की घोषणा हेडर समर्पित <iosfwd> आला के साथ बनाए रखा और शामिल मुख्य हैडर द्वारा चल रहे यह सुनिश्चित करना है स्थिरता। मैंने कभी "कक्षा एक्स" नहीं रखा कार्यान्वयन फ़ाइल में जब तक कक्षा में भी परिभाषित नहीं किया जाता है। याद रखें कि "कक्षा एक्स;" के प्रतीत लाभ आगे की घोषणा इतनी अधिक नहीं है कि वे #include से बचें, और जितना अधिक वे शामिल फाइलें बड़ी हो सकती हैं और बदले में कई अन्य फाइलें शामिल हो सकती हैं: समर्पित आगे-घोषणा हेडर आमतौर पर उसमें से अधिकतर बहुमत से बचते हैं।

1

आगे की घोषणा अनावश्यक है, लेकिन यह भी काफी हानिकारक है। हो सकता है कि लेखक बहुत आगे की घोषणाओं का उपयोग करता है, और यह सुनिश्चित नहीं करता कि वे हमेशा आवश्यक हैं।

3

यदि आगे की घोषणा शामिल होने से पहले सामने आई, तो यह निर्भरता को खत्म कर सकता है। वास्तविक .h फ़ाइल के बाद आ रहा है जो इसे परिभाषित करता है कुछ भी नहीं करता है।

+0

क्या आप विस्तृत कर सकते हैं? मैंने मूल रूप से यह वही बात लिखी थी, लेकिन फिर मैंने इसके बारे में कुछ और सोचा और पाया कि यदि बार आगे फू घोषित करता है, तो तत्काल # Foo.h शामिल करता है, यह होना चाहिए) हमेशा फू की घोषणा में परिणाम होता है, और बी) पहले से ही फू घोषित करने वाले किसी अन्य शीर्षलेख पर निर्भर न करें। क्या आप एक उदाहरण दे सकते हैं जहां # अंतर्निहित वास्तव में मदद करने से पहले आगे की घोषणा हो रही है? – mgiuca

+0

@mgiuca - संकलन के समय को कम करता है। बार-बार कोड केवल पॉइंटर्स का उपयोग करता है, और कक्षा के वास्तविक आकार की आवश्यकता नहीं होती है [और कभी भी उदाहरण नहीं बनाते]।उन परिस्थितियों में, एक आगे की घोषणा पर्याप्त है, जो आपको # फ़ाइलों को शामिल करने का समय बचाती है। –

+0

@ फ़ू बह हां, यह एक # अंतर्निहित * के बजाय आगे की घोषणा का उपयोग करने का एक अच्छा कारण है। लेकिन यह समझा नहीं है कि आप दोनों क्यों होंगे। यदि आपके पास दोनों थे, तो आपको शामिल फ़ाइल को संसाधित करने की आवश्यकता होगी, चाहे इसका उपयोग किया गया हो या नहीं। – mgiuca

2

मूल class Foo; निहित हो सकता है।

याद रखें कि, यदि स्रोत केवल फू क्लास के पॉइंटर्स का उपयोग करता है [और वास्तव में फ़ू ऑब्जेक्ट्स या डेरफरेंस फ़ू पॉइंटर्स बनाने की कोशिश नहीं करता है], तो आपको इसका उपयोग करने से पहले कक्षा को परिभाषित करने की आवश्यकता नहीं है।

कोड देखकर बिना, मैं अनुमान है कि bar.cpp के मूल संस्करण कोड है कि foo

की परिभाषा मैं बड़ी परियोजनाओं में आगे घोषणाओं का उपयोग की आवश्यकता नहीं है समय संकलन को कम करने के लिए किया था खतरे चाहते हैं। संकलन समय एक समस्या नहीं है जब यह एक सेकंड लेता है, लेकिन जब परियोजनाओं को हर सेकेंड बनाने में एक घंटे लगते हैं :)

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