मुझे लगता है कि यहां एक भ्रम है। समस्या हेडर के बारे में नहीं है। शीर्षलेख कुछ भी नहीं करते हैं (वे कई स्रोत-कोड फ़ाइलों के बीच स्रोत टेक्स्ट के सामान्य बिट्स को शामिल करने के तरीके हैं)।
समस्या, जितना अधिक है, यह है कि सी ++ में कक्षा घोषणाओं को सबकुछ, सार्वजनिक और निजी परिभाषित करना है, उदाहरण के लिए एक उदाहरण को काम करने की आवश्यकता है। (यह जावा के बारे में भी सच है, लेकिन बाहरी रूप से संकलित कक्षाओं के कामों का संदर्भ साझा हेडर जैसे किसी भी चीज़ का उपयोग अनावश्यक बनाता है।)
यह सामान्य ऑब्जेक्ट ओरिएंटेड टेक्नोलॉजीज की प्रकृति में है (केवल सी ++ एक नहीं) कि किसी को कार्यान्वित करने के लिए उपयोग किए जाने वाले ठोस वर्ग और उसके कन्स्ट्रक्टर का उपयोग करने की आवश्यकता है, भले ही आप केवल सार्वजनिक भागों का उपयोग कर रहे हों। डिवाइस (3, नीचे) इसे छुपाता है। (1, नीचे) में अभ्यास चिंताओं को अलग करता है, चाहे आप (3) हों या नहीं।
अमूर्त वर्गों का उपयोग करें जो केवल सार्वजनिक भागों को परिभाषित करते हैं, मुख्य रूप से विधियों, और कार्यान्वयन वर्ग को उस सार वर्ग से प्राप्त करते हैं। तो, हेडर के लिए सामान्य सम्मेलन का उपयोग करते हुए, एक सार.hpp है जो आसपास साझा किया जाता है। एक कार्यान्वयन.hpp भी है जो विरासत वर्ग घोषित करता है और यह केवल मॉड्यूल के आसपास पारित होता है जो कार्यान्वयन के तरीकों को लागू करता है। कार्यान्वयन.hpp फ़ाइल उस वर्ग घोषणा में उपयोग के लिए "abstract.hpp" शामिल करेगी, ताकि सारणित इंटरफ़ेस की घोषणा के लिए एक ही रखरखाव बिंदु हो।
अब, यदि आप कार्यान्वयन कक्षा घोषणा के छिपाने को लागू करना चाहते हैं, तो आपको विशिष्ट, पूर्ण श्रेणी घोषणा के बिना ठोस उदाहरण के निर्माण का अनुरोध करने का कोई तरीका होना चाहिए: आप नए का उपयोग नहीं कर सकते हैं और आप कर सकते हैं स्थानीय उदाहरणों का उपयोग नहीं करते हैं। (हालांकि आप हटा सकते हैं।) सहायक कार्यों का परिचय (कक्षा के उदाहरणों के संदर्भ देने वाले अन्य वर्गों पर विधियों सहित) विकल्प है।
सारणी फ़ाइल/इंटरफ़ेस के लिए साझा परिभाषा के रूप में उपयोग की जाने वाली हेडर फ़ाइल के साथ या बाहरी भाग के साथ फ़ंक्शन हस्ताक्षर शामिल हैं। इन कार्यों को मॉड्यूल में लागू किया जाना चाहिए जो विशिष्ट वर्ग कार्यान्वयन का हिस्सा हैं (इसलिए वे पूर्ण श्रेणी की घोषणा देखते हैं और कन्स्ट्रक्टर का उपयोग कर सकते हैं)। सहायक फ़ंक्शन का हस्ताक्षर शायद कन्स्ट्रक्टर की तरह ही होता है, लेकिन परिणामस्वरूप यह एक उदाहरण संदर्भ देता है (यह कन्स्ट्रक्टर प्रॉक्सी एक नल पॉइंटर वापस कर सकता है और यदि आप उस तरह की चीज़ पसंद करते हैं तो यह अपवाद भी फेंक सकता है)। सहायक कार्य एक विशेष कार्यान्वयन उदाहरण बनाता है और इसे अमूर्त वर्ग के उदाहरण के संदर्भ के रूप में प्रस्तुत करता है।
मिशन पूरा हुआ।
ओह, और पुन: संकलन और रिंकंकिंग आपको जिस तरीके से काम करना चाहिए, उसे कॉल करना मॉड्यूल के पुनर्मूल्यांकन से परहेज करना चाहिए, जब केवल कार्यान्वयन में परिवर्तन होता है (क्योंकि कॉलिंग मॉड्यूल अब कार्यान्वयन के लिए कोई संग्रहण आवंटन नहीं करता है)।
@ फ़्रेडरिक, आप "बूब" नहीं हैं, यह एक अच्छा सवाल है! – jwfearn
अच्छी तरह से देखा (पन इरादा)! –