2011-04-06 12 views
10

बस कुछ स्पष्टीकरण चाहते थे। क्या अमूर्त आधार कक्षाओं में निजी सदस्य कभी नहीं होना चाहिए? उदाहरणसी ++ अमूर्त बेस क्लास निजी सदस्य

class abc{ 
public: 
    virtual void foo()=0; 
private: 
    int myInt; 
} 

के लिए आप मींट जब से तुम एबीसी का एक उदाहरण नहीं बना सकते का उपयोग नहीं कर सकते हैं और वह अपने निजी के बाद से एक व्युत्पन्न वर्ग में नहीं होगा। क्या कोई ऐसी स्थिति है जहां आप अमूर्त आधार वर्गों में निजी सदस्यों का उपयोग करेंगे या यह गलत है?

+0

ऐसे ही एक निजी सदस्य एक अमूर्त वर्ग में कोई मतलब नहीं है, यह मतलब नहीं है बस के रूप में * किसी अन्य * वर्ग में। –

+0

@ मार्टिन्हो फर्नांडीस: क्या आप कह रहे हैं कि निजी डेटा सदस्य कभी समझ में नहीं आते हैं या आप विशेष रूप से 'int' या 'myInt' के बारे में कुछ कह रहे हैं? –

+0

मैं कह रहा हूं कि निजी डेटा सदस्य जिनका उपयोग नहीं किया जाता है * कहीं भी * समझ में नहीं आता है।'कक्षा एबीसी {सार्वजनिक: आभासी शून्य foo() {};/* अब अमूर्त नहीं है */निजी: int myInt; 'myInt को और अधिक उपयोगी नहीं बनाता है। –

उत्तर

12

सी ++ में आपके पास एक अमूर्त वर्ग हो सकता है जिसमें गैर शुद्ध वर्चुअल विधियां हों। उस मामले में, और डिजाइन के आधार पर यह निजी सदस्यों के लिए मतलब कर सकते हैं:

class base { 
    std::string name; 
public: 
    base(std::string const & n) : name(n) {} 
    std::string const & getName() const { return name; } 

    virtual void foo() = 0; 
}; 

कि कोड सुनिश्चित करता है कि हर वस्तु है कि आधार से निकला एक नाम है जो, कि निर्माण के दौरान सेट कर दिया जाता है और कभी नहीं जीवनकाल के दौरान बदल जाता है वस्तु का।

संपादित: पूरा होने के लिए के बाद चार्ल्स बेली मुझे इसके बारे में में याद दिलाया उसके answer

तुम भी शुद्ध आभासी कार्यों को परिभाषित कर सकते हैं और उस स्थिति में, निजी गुण भी मतलब हो सकता है:

// with the above definition of base 
void base::foo() { 
    std::cout << "My name is " << name << std::endl; 
} 
0

जैसा कि यह खड़ा है, आपका उदाहरण कोई समझ नहीं आता है।

हालांकि, सार आधार वर्गों को सदस्य कार्य परिभाषाएं रखने की अनुमति है, जो बदले में बेस क्लास में निजी सदस्य डेटा तक पहुंचने की अनुमति है।

1

एक सार आधार वर्ग में सभी विधियां शुद्ध आभासी नहीं होनी चाहिए। आपके पास कुछ विधियां हो सकती हैं जो सभी उप-वर्गों के लिए उपयोगी हैं। इस प्रकार यदि आपके पास बेस क्लास में कुछ कार्यक्षमता है जो आंतरिक स्थिति को संशोधित कर रही है तो आपके पास निजी सदस्यों के लिए निजी सदस्य होंगे।

2

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

उदाहरण के लिए:

class abc{ 
public: 
    virtual void foo()=0; 
private: 
    int myInt; 
}; 

class xyz : public abc 
{ 
    virtual void foo(); 
}; 

#include <iostream> 
#include <ostream> 

void xyz::foo() 
{ 
    std::cout << "xyz::foo()\n"; 
    abc::foo(); 
} 

void abc::foo() 
{ 
    std::cout << "abc::foo(): " << myInt++ << '\n'; 
} 

#include <memory> 

int main() 
{ 
    std::auto_ptr<abc> p(new xyz()); // value-initialization important 
    p->foo(); 
    p->foo(); 
} 

आउटपुट:

xyz::foo() 
abc::foo(): 0 
xyz::foo() 
abc::foo(): 1 
+0

आपने ''' '' '' '' '' '' '' '' '_' _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ :) – isnullxbh

-5

आप इस शॉर्टकट रास्ता

कोड PHP में है के माध्यम से निजी सदस्य का उपयोग कर सकते

abstract class myclass1 
{ 
      private $var="46789"; 
     public function test($valuetoset) 
     { 
      echo $this->var = $valuetoset; 

     } 
} 

class myclass2 extends myclass1 
{ 


} 

$obj = new myclass2(); 
$obj->test(78);