मेरे पास सिंगलटन क्लास फू है:

class foo
{
    static foo* pointer;
    foo();

public:
    static foo* instance();
    static void destroy();
}

foo::foo()
{
    
}



foo* foo::instance()
{
    if (pointer == 0)
        pointer = new foo();
    return pointer;
}


void foo::destroy()
{
    delete pointer;
    pointer = 0;
}

मैं इस वर्ग का परीक्षण करने की कोशिश कर रहा हूं (कक्षा में अन्य विधियां भी हैं जो दिखाने के लिए यहां आवश्यक नहीं हैं)। मैं एक MockClassfoo बनाया है और MockClassfoo में वर्ग 'फू' विरासत में मिला है।

मैंने एक नकली MockClassfoo उदाहरण बनाया है जैसा कि मेरी परीक्षा कक्षा में दिखाया गया है:

class Test
{
 auto aFake =(MockClassfoo *)MockClassfoo ::instance();
             fooAccessor::set(aFake);
}

हालांकि मेरी कक्षा fooAccessor में मैं foo का उदाहरण प्राप्त करना चाहता हूं.. सूचक को हटाएं और इसमें मेरा नकली उदाहरण असाइन करें जो संभव नहीं है:

class fooAccessor
{
public:
    static void set(foo * other)
    {
        foo::instance();
        delete foo::pointer; //here i get error saying pointer is inaccessible
        foo::pointer = other; //here i get error saying pointer is inaccessible
    }
};

मैं class'foo' में पॉइंटर की एक्सेसिबिलिटी में कोई बदलाव नहीं करना चाहता। मैं केवल उदाहरण प्राप्त करना चाहता हूं, इसे हटाना चाहता हूं और इसे अपना नकली उदाहरण असाइन करना चाहता हूं। इसे कैसे करें इस पर कोई सुझाव क्योंकि यह कहता है कि यह पहुंच योग्य नहीं है?

0
Mr.Shark 28 अक्टूबर 2020, 13:23

2 जवाब

सबसे बढ़िया उत्तर

अगर MockClassfoo को foo से इनहेरिट किया गया है, तो foo को अंतिम न बनाएं:

  1. कन्स्ट्रक्टर और स्थिर फू सूचक;* सुरक्षित बनाएं
  2. मॉक क्लास में एक getInstance परिभाषित करें जो foo के बजाय एक MockClassFoo आवंटित करता है

यह चाल चलनी चाहिए।


आपके कोड के बारे में कुछ संकेत:

  • सी ++ में एक पोंटर, नलप्टर (या प्राचीन न्यूल) का उपयोग करके शुरू किया जाना चाहिए, और नलप्टर (या न्यूल) के मुकाबले तुलना की जानी चाहिए। 0 के साथ नहीं।
  • मैं कक्षा की शुरुआत में स्पष्ट निजी: कीवर्ड जोड़ना पसंद करता हूं
  • मुझे "नष्ट" विधि का विचार पसंद नहीं है। इसके बजाय विनाशक का प्रयोग करें
1
Stefano Buora 28 अक्टूबर 2020, 17:06

आपको fooAccessor को कक्षा foo के अंदर एक मित्र वर्ग बनाना होगा। ऐसा करके, foo, fooAccessor को अपने निजी सदस्यों तक पहुंचने की अनुमति देता है।

1
aep 28 अक्टूबर 2020, 13:32