2015-02-05 34 views
8

मैंने हमेशा हेडर फाइलों के बारे में सोचा है कि एक वर्ग का वर्णन करने वाले 'सार्वजनिक इंटरफेस' के रूप में, इस मामले में निजी क्षेत्रों और कार्यों को सीपीपी फ़ाइल में रखना बेहतर होगा।सी ++, निजी कार्यों को वास्तव में हेडर फ़ाइल में होना आवश्यक है?

मैं समझता हूं कि निजी क्षेत्रों को हेडर में होना आवश्यक है ताकि अन्य वर्ग बता सकें कि कक्षा का एक उदाहरण कितना मेमोरी उपभोग करेगा, लेकिन यह मेरे लिए हुआ क्योंकि मैं एक निजी सहायक कार्य लिखने वाला था, यह कि फ़ंक्शन को स्थिर बनाया जा सकता है, इस मामले में इसे 'कक्षा का हिस्सा' होने की कोई आवश्यकता नहीं थी, यह वर्ग परिभाषा की .cpp फ़ाइल में नियमित रूप से नियमित रूप से कार्य हो सकता था।

यह तो मेरे लिए हुआ है कि सभी निजी कार्यों के संभावित बजाय वर्ग क्षेत्रों के लिए संकेत/संदर्भ को स्वीकार कक्षा में परिभाषित किया जा करने की उम्मीद से स्थिर होने के लिए फिर से लिखा जा सकता है।

यह हेडर फ़ाइल में किसी भी निजी फ़ंक्शन को घोषित करने की आवश्यकता को खत्म कर देगा।

मैं तो अब मैं पूछना चाहता हूँ परंपराओं का पालन करना चाहते हैं, यह सी में एक स्थापित सम्मेलन माना ++, कि गैर स्थिर निजी कार्यों हेडर फाइल में होना चाहिए? स्थिर कार्यों या स्थैतिक स्थिरांक के बारे में क्या?

संपादित मैं कुछ कोड में डाल करने के लिए समझाने के लिए कि मैं क्या कर रहा हूँ जा रहा हूँ पर हो रही है:

हेडर फाइल:

#ifndef SOME_CLASS_H 
#define SOME_CLASS_H 

class SomeClass 
{ 
private: 
    int x; 
public: 
    void combineWithX(int y); 
}; 

#endif 

.cpp फ़ाइल

#include "SomeClass.h" 

void someHelper(int* x) 
{ 
    *x = (*x) + 1; 
} 

void SomeClass::combineWithX(int y) 
{ 
    someHelper(&x); 
    x += y; 
} 

ध्यान दें कि में someHelper(int* x) सीपीपी फ़ाइल निजी सदस्य एक्स को भावना में संदर्भित करती है, लेकिन सीधे नहीं, और इसलिए हेडर में दिखाई देने की आवश्यकता नहीं है। मुझे आश्चर्य है कि इस तरह की चीज को 'खराब शैली' माना जाता है

+3

ध्यान दें कि निजी कार्यों को कक्षा के अंदर से मित्रता की आवश्यकता होगी, अन्यथा वे निजी सदस्यों तक नहीं पहुंच पाएंगे। अगर उन्हें निजी सदस्यों की आवश्यकता नहीं है, तो शायद उन कार्यों को स्वयं सदस्य नहीं होना चाहिए। –

+1

चूंकि आप एक बार बंद होने के लिए कक्षा को फिर से खोल नहीं सकते हैं (सी ++ 11 9.2-पी 2), हां, आपके सदस्य के कार्यों * और * उस वर्ग के सदस्य वर्र्स * को इसकी घोषणा में संगत होना है। आप निश्चित रूप से एक [pimpl] कर सकते हैं (http://stackoverflow.com/questions/843389/the-pimpl-idiom-in-practice) - वांछित अगर पूरक। – WhozCraig

+0

@WhozCraig धन्यवाद, मैंने आपका लिंक उधार लिया (मूल रूप से मैं एक बदतर प्रश्न से जुड़ा हुआ) –

उत्तर

7

मैं मानता हूं कि यह एक समस्या है कि कार्यान्वयन विवरण को हेडर फ़ाइल में उजागर करने की आवश्यकता है; यह इंटरफेस और कार्यान्वयन के अलगाव के साथ हस्तक्षेप करता है।

निजी सहायक कार्य को .cpp फ़ाइल में नि: शुल्क फ़ंक्शंस में स्थानांतरित करना (मुझे लगता है कि "स्थैतिक" से आपका मतलब है) यह काम नहीं करेगा यदि उन कार्यों को निजी सदस्य चरों तक पहुंचने की आवश्यकता है।

आप pImpl idiom(more)

8

pimpl मुहावरा को देखने के लिए दिलचस्पी हो सकती है की जरूरत है केवल

  1. अगर आप निजी सदस्य स्थानांतरित करने के लिए 'चर' सार्वजनिक हैडर से बाहर (दोहरी संगतता बनाए रखने के लिए की जरूरत है नई रिलीज के)
  2. यदि यह डिज़ाइन
को समझना आसान बनाता है

यदि आप केवल आंतरिक सदस्य 'फ़ंक्शन' सार्वजनिक हेडर से बाहर ले जाना चाहते हैं, तो आंतरिक कक्षा का उपयोग करना पर्याप्त है। इसमें पीआईएमपीएल मुहावरे जैसे पुनर्निर्देशन दंड नहीं है।

सार्वजनिक।ज फ़ाइल

#ifndef SOME_CLASS_H 
#define SOME_CLASS_H 

class SomeClass 
{ 
private: 
    struct Private; 
    int x; 
public: 
    void combineWithX(int y); 
}; 

#endif 

.cpp फ़ाइल में

#include "SomeClass.h" 

/** Declare all private member functions of SomeClass here 
    This class can access not only private members of SomeClass 
    but also friends of SomeClass. */ 
struct SomeClass::Private 
{ 
    static void someHelper(SomeClass& self) 
    { 
    self.x = self.x + 1; 
    } 
}; 

void SomeClass::combineWithX(int y) 
{ 
    Private::someHelper(*this); 
    x += y; 
} 

SomeClass::Private हेडर फाइल में उनमें से किसी को घोषित करने के लिए बिना सहायक कार्यों SomeClass के सभी निजी/मित्र के लिए पूरा उपयोग किया है, के किसी भी संख्या हो सकती है ।

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