簡體   English   中英

內部類可以訪問私有變量嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM