夥計們,我在科技博客上遇到過這個問題,問題是什麼問題才能解決在下面的代碼中產生的編譯器錯誤。我搜索了幾個小時,無法得到答案。訪問基類從派生類中受保護的嵌套類
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」指針。
您可以在派生使用巢類中聲明use_someclass。 –