2015-12-07 155 views
0

夥計們,我在科技博客上遇到過這個問題,問題是什麼問題才能解決在下面的代碼中產生的編譯器錯誤。我搜索了幾個小時,無法得到答案。訪問基類從派生類中受保護的嵌套類

class SomeClass 
{ 
public: 
    int data; 
protected: 
    class Nest 
    { 
     public: 
      int nested; 
    }; 
public: 
    static Nest* createNest(){return new Nest;} 
}; 

void use_someclass() 
{ 
    SomeClass::Nest* nst = SomeClass::createNest(); 
    nst->nested = 5; 
} 

A.    Make function void use_someclass() a friend of class SomeClass. 
B.    Make the function createNest() a non-static function of SomeClass. 
C.    Declare the class Nest in public scope of class SomeClass. 
D.    Make the object nst a reference object, and make the function 
     createNest() return a Nest&. 
E.    Derive a class from SomeClass. Make the object nst a derived class 
     pointer so that it can access SomeClass's protected declarations. 

C肯定是正確和瑣碎的。 我相信A也是對的,特別是E是做這種事情的經典方式。 我想實現E中所說的,但有一些困難。 (我希望有人也可以實現在一個想法),下面是我的代碼:

class derived:public SomeClass{}; 
void use_someclass() 
{ 
    derived::Nest *nst=SomeClass::createNest(); 
    nst->nested = 5; 
} 
在上面

,這個想法是我們可以從一個派生類訪問鳥巢定義。 在函數use_someclass()中,在第一行中,右側是一個靜態函數,並返回類型Nest *,但在左側,我不知道如何匹配右側類型。 「derived :: Nest」是錯誤的。編譯器錯誤:無法訪問受保護的成員。 Nest只是SomeClass中的一個定義,不是成員。

我們可以用什麼來取代「derived :: Nest」?派生的確看到了Nest的定義,但我不知道如何「說」它。也許以某種方式通過「this」指針。

+0

您可以在派生使用巢類中聲明use_someclass。 –

回答

0

您可以在派生類中改變的可視性:

class derived : public SomeClass { 
    public: 
    using SomeClass::Nest; 
} 
+0

謝謝。昨天經過一番搜索之後,我也發現了這一點。「使用SomeClass :: Nest」的作品。我們有其他選擇嗎? 「使用」會打破受保護的限定符。 –

相關問題