[英]Can inner classes access private variables?
class Outer {
class Inner {
public:
Inner() {}
void func() ;
};
private:
static const char* const MYCONST;
int var;
};
void Outer::Inner::func() {
var = 1;
}
const char* const Outer::MYCONST = "myconst";
當我使用類 Outer::Inner' 進行編譯時出現此錯誤,其中沒有名為“var”的成員
內部類是它在其中定義的類的朋友。
所以,是的; 類型的對象Outer::Inner
可以訪問成員變量var
類型的對象的Outer
。
但是,與 Java 不同的是, Outer::Inner
類型的對象與父類的對象之間沒有關聯。 您必須手動建立父子關系。
#include <string>
#include <iostream>
class Outer
{
class Inner
{
public:
Inner(Outer& x): parent(x) {}
void func()
{
std::string a = "myconst1";
std::cout << parent.var << std::endl;
if (a == MYCONST)
{ std::cout << "string same" << std::endl;
}
else
{ std::cout << "string not same" << std::endl;
}
}
private:
Outer& parent;
};
public:
Outer()
:i(*this)
,var(4)
{}
Outer(Outer& other)
:i(other)
,var(22)
{}
void func()
{
i.func();
}
private:
static const char* const MYCONST;
Inner i;
int var;
};
const char* const Outer::MYCONST = "myconst";
int main()
{
Outer o1;
Outer o2(o1);
o1.func();
o2.func();
}
內部類可以訪問外部類的所有成員,但它沒有對父類實例的隱式引用(與 Java 的一些奇怪之處不同)。 因此,如果將外部類的引用傳遞給內部類,則它可以引用外部類實例中的任何內容。
of Outer should have access to all of Outer's members, public or private.任何Outer 的東西都應該可以訪問所有 Outer 的成員,無論是公共的還是私有的。
編輯:您的編譯器是正確的,var 不是 Inner 的成員。 但是如果你有一個指向 Outer 實例的引用或指針,它可以訪問它。
首先,您試圖訪問 C++ 中不允許的類之外的非靜態成員var
。
馬克的回答是正確的。
任何屬於 Outer 的東西都應該可以訪問所有 Outer 的成員,無論是公共的還是私有的。
所以你可以做兩件事,要么將var
聲明為static
,要么使用外部類實例的引用來訪問“var”(因為朋友類或函數也需要引用來訪問私有數據)。
靜態變量
將var
更改為static
如果您不希望var
與類的實例相關聯。
#include <iostream>
class Outer {
private:
static const char* const MYCONST;
static int var;
public:
class Inner {
public:
Inner() {
Outer::var = 1;
}
void func() ;
};
};
int Outer::var = 0;
void Outer::Inner::func() {
std::cout << "var: "<< Outer::var;
}
int main() {
Outer outer;
Outer::Inner inner;
inner.func();
}
輸出變量:1
非靜態變量
對象的引用是訪問任何非靜態成員變量所必需的。
#include <iostream>
class Outer {
private:
static const char* const MYCONST;
int var;
public:
class Inner {
public:
Inner(Outer &outer) {
outer.var = 1;
}
void func(const Outer &outer) ;
};
};
void Outer::Inner::func(const Outer &outer) {
std::cout << "var: "<< outer.var;
}
int main() {
Outer outer;
Outer::Inner inner(outer);
inner.func(outer);
}
輸出變量:1
編輯 - 外部鏈接是指向我的博客的鏈接。
var 不是內部類的成員。
要訪問 var,應該使用指向外部類實例的指針或引用。 例如,如果內部類是外部類的朋友,則 pOuter->var 將起作用,或者,如果嚴格遵循 C++ 標准,則 var 是公共的。
一些編譯器將內部類視為外部的朋友,但有些可能不是。 有關IBM 編譯器,請參閱此文檔:
“嵌套類是在另一個類的范圍內聲明的。嵌套類的名稱是其封閉類的局部名稱。除非使用顯式指針、引用或對象名稱,否則嵌套類中的聲明只能使用可見結構,包括來自封閉類和全局變量的類型名稱、靜態成員和枚舉數。
嵌套類的成員函數遵循常規訪問規則,對其封閉類的成員沒有特殊的訪問權限。 封閉類的成員函數對嵌套類的成員沒有特殊訪問權限。”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.