2012-05-06 6 views
5

मैं स्पष्ट हूं कि जब मैं आगे की घोषणा का उपयोग नहीं कर सकता/सकती हूं लेकिन मुझे अभी भी एक चीज़ के बारे में निश्चित नहीं है।अग्रेषित घोषणा/शीर्षलेख शामिल करने के लिए सबसे अच्छा कब?

चलो कहते हैं कि मैं जानता हूँ कि मैं एक हैडर अभी या बाद में संदर्भ डी करने के लिए वर्ग ए का एक उद्देश्य रहा है कि क्या यह और अधिक कुशल है जैसे कुछ करने के लिए पर स्पष्ट नहीं कर रहा हूँ शामिल करने के लिए है कि चलो ..

class A; 
class B 
{ 
    A* a; 
    void DoSomethingWithA(); 
}; 

और उसके बाद सीपीपी में कुछ की तरह .. है

#include "A.hpp" 
void B::DoSomethingWithA() 
{ 
    a->FunctionOfA(); 
} 

या मैं रूप में अच्छी तरह सिर्फ पहली जगह में बी के हेडर फाइल में एक के हेडर शामिल हो सकता है? यदि पूर्व अधिक कुशल है तो मैं इसकी सराहना करता हूं अगर किसी ने स्पष्ट रूप से समझाया कि मुझे क्यों संदेह है कि संकलन प्रक्रिया के साथ इसका कुछ संबंध है जो मैं हमेशा के बारे में और सीखने के साथ कर सकता हूं।

उत्तर

11

उपयोग करें (अपने उदाहरण के रूप में) जब भी संभव हो। यह संकलन के समय को कम करता है, लेकिन कोड के लिए हेडर और लाइब्रेरी निर्भरताओं को अधिक महत्वपूर्ण रूप से कम करता है जिसे कार्यान्वयन के विवरण की देखभाल करने की आवश्यकता नहीं है और इसकी परवाह नहीं है। सामान्य रूप से, वास्तविक कार्यान्वयन के अलावा कोई भी कोड कार्यान्वयन विवरणों पर ध्यान नहीं देना चाहिए।

यहाँ इस पर गूगल के औचित्य है: Header File Dependencies

+0

जवाब देने के लिए गूगल सी ++ स्टाइल गाइड – LihO

+0

चियर्स के लिए +1, और Googles स्टाइल गाइड लगता है कि यह एक बहुत अच्छा पढ़ा धन्यवाद होगी! – Holly

+8

मुझे पता है कि यह धागा पुराना है, लेकिन मुझे लगता है कि मुझे इंगित करना चाहिए, अगर किसी और को तर्क की तलाश है, तो Google तर्क बदल गया है, "जहां संभव हो, आगे की घोषणाओं का उपयोग करने से बचें। बस # आपको आवश्यक शीर्षकों को शामिल करें। " – soulsabr

0

अपने संकलन कुशल बनाने की कोशिश न करें। ड्रेगन हो। B.hpp में बस A.hpp शामिल करें।

C और C++ हेडर फाइल के लिए मानक अभ्यास यह केवल एक बार संकलित किया गया है सुनिश्चित करने के लिए एक #ifdef में हेडर फाइल के सभी रैप करने के लिए है:

#ifdef _A_HPP_ 
#define _A_HPP_ 

// all your definitions 

#endif 

इस तरह, अगर आप B.hpp में #include "A.hpp", आपके पास एक प्रोग्राम हो सकता है जिसमें दोनों शामिल हैं, और यह तोड़ नहीं जाएगा क्योंकि यह दो बार परिभाषित करने की कोशिश नहीं करेगा।

4

जब आप आगे की घोषणा का उपयोग करते हैं, तो आप स्पष्ट रूप से के साथ कहते हैं "कक्षा बी को कक्षा ए के आंतरिक कार्यान्वयन के बारे में कुछ भी जानने की आवश्यकता नहीं है, इसे केवल यह पता होना चाहिए कि नाम ए श्रेणी मौजूद है"यदि आप उस हेडर को शामिल करने से बच सकते हैं, तो इससे बचें। - इसके बजाय आगे की घोषणा का उपयोग करना अच्छा अभ्यास है क्योंकि आप इसका उपयोग करके अनावश्यक निर्भरताओं को खत्म करते हैं।

यह भी ध्यान दें कि जब आप हेडर फ़ाइल बदलते हैं, तो यह उन सभी फ़ाइलों का कारण बनता है जिनमें इसे पुन: सम्मिलित किया जाता है।

ये सवाल भी तुम्हारी मदद करेगा: आगे घोषणाओं
What are the drawbacks of forward declaration?
What is the purpose of forward declaration?

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