2011-01-31 22 views
6

चलो एक सी ++ ऑब्जेक्ट ए है। इसमें दो चर (VAR1 और VAR2) हैं जो अपने बच्चों के लिए सुलभ हैं। ऑब्जेक्ट बी ए बढ़ाता है और इसमें एक निजी चर VAR3 है, यह VAR1 और VAR2 तक भी पहुंच सकता है। ए/बी के प्रत्येक उदाहरण में अपने चर होते हैं।सी ++ चर - घोषणा और परिभाषित करें। विरासत

क्या यह चर घोषित करने और परिभाषित करने का सही तरीका होगा?

A.h


class A { 
protected: 
    static std::string const VAR1; 
    static std::string VAR2; 
}; 

A.cpp


#include "A.h" 
using namespace std; 
string const A::VAR1 = "blah"; 
string A::VAR2; 

B.h


#include "A.h" 
class B : public A { 
private: 
    static std::string VAR3; 

public: 
    B(std::string const v1, std::string const v2); 
    void m() const; 
}; 

B.cpp


#include "B.h" 
using namespace std; 

string B::VAR3; 

B::B(string const v1, string const v2) { 
    VAR2 = v1; 
    VAR3 = v2; 
} 

void B::m() const { 
    // Print VAR1, VAR2 and VAR3. 
} 
+1

आपको क्या त्रुटियां हैं? – Falmarri

+0

यह होमवर्क है? – nairdaen

उत्तर

4

ए/बी के प्रत्येक उदाहरण के अपने चर हैं।

क्या यह चर घोषित करने और परिभाषित करने का सही तरीका होगा?

नहीं, आप static रूप A के सदस्यों की घोषणा की है जिसका मतलब है कि वे कक्षा-चर, नहीं उदाहरण-चर हैं। प्रत्येक उदाहरण को इसकी अपनी प्रति प्राप्त नहीं होती है। इसके बजाए, वे सभी एक ही उदाहरण साझा करते हैं।

मेक तो गैर static:

class A { 
protected: 
    std::string const VAR1; 
    std::string VAR2; 
}; 

... और फिर, ज़ाहिर है, आप वैश्विक प्रारंभकर्ता तो यह से छुटकारा पाने की जरूरत नहीं है:

string const A::VAR1 = "blah"; 
string A::VAR2; 

...और यदि आप VAR1 चाहते एक डिफ़ॉल्ट मान हर बार A instantiated है के लिए है, तो आप उस वर्ग 'प्रारंभकर्ता सूची में कर सकते हैं (या ctor शरीर में, आप एक गुंडा :) हैं):

A::A() : VAR1("blah") {}; 
+0

@downvoter: कृपया समझाएं कि इस पोस्ट में –

+0

@downvoter में सुधार किया जा सकता है: यदि आपको एक पंक कहा जाना पसंद नहीं आया, तो मैं सिर्फ मुखौटा था :) –

+0

हाय और धन्यवाद। बाहरी बनाम स्थैतिक चर के बारे में पढ़ने के बाद मुझे थोड़ा उलझन में आया ... तो, संक्षेप में। मैं सभी घोषणाओं को गैर स्थैतिक बना देता हूं, सभी परिभाषाओं को हटाता हूं और रचनाकारों में मान निर्दिष्ट करता हूं। सही? – Petr

1

ए/बी के प्रत्येक उदाहरण के लिए अपने स्वयं के वेरिएबल नहीं है।

ऐसा नहीं है। आपने उन्हें static घोषित कर दिया है। ऐसा करना बंद करें और आप अपने वांछित परिणाम के करीब आ सकते हैं।

1

नहीं, आपको यह गलत लगता है।

  • समस्या प्रत्येक उदाहरण की आवश्यकता है चर के अपने स्वयं के सेट है करने के लिए, तो क्यों आप A और static रूप B के डेटा की घोषणा कर रहे हैं?
  • आपको कुछ भी लागू करने की आवश्यकता नहीं है। समस्या सिर्फ आपको प्रकार और उनके सदस्य डेटा घोषित करने के लिए कहती है।
  • कन्स्ट्रक्टर आवश्यक है या तो जहां तक ​​आवश्यकताएं आपको करने के लिए कहें।
0
class A{ 
protected: 
    char var1,var2; 
}; 

class B: public A { 
private: 
    char var3; 
}; 

void main() 
{ 
    B b1; 
    b1.var3='a'; 
} 
संबंधित मुद्दे