内部类可以访问私有变量吗?

时间:2009-01-28 01:15:07

标签: c++ inner-classes

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'

的成员

5 个答案:

答案 0 :(得分:106)

内部类是其定义的类的朋友。
所以,是的;类型为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();
}

答案 1 :(得分:25)

内部类可以访问外部类的所有成员,但它没有对父类实例的隐式引用(与Java的一些奇怪之处不同)。因此,如果将对外部类的引用传递给内部类,它可以引用外部类实例中的任何内容。

答案 2 :(得分:6)

Outer part 的任何内容都应该可以访问所有Outer的公共或私人成员。

编辑:你的编译器是正确的,var不是Inner的成员。但是如果你有一个引用或指向Outer实例的指针,它就可以访问它。

答案 3 :(得分:1)

var不是内部类的成员。

要访问var,应使用指向外部类实例的指针或引用。例如如果内部类是外部的朋友,则pOuter-&gt; var将起作用,如果严格遵循C ++标准,则var是public。

有些编译器将内部类视为外部的朋友,但有些可能不是。见this document for IBM compiler

“嵌套类在另一个类的范围内声明。嵌套类的名称是其封闭类的本地。除非使用显式指针,引用或对象名称,否则嵌套类中的声明只能使用可见构造,包括封闭类和全局变量中的类型名称,静态成员和枚举器。

嵌套类的成员函数遵循常规访问规则,并且对其封闭类的成员没有特殊的访问权限。封闭类的成员函数对嵌套类的成员没有特殊访问权。“

答案 4 :(得分:1)

首先,您正在尝试在C ++不允许的类之外访问非静态成员var

马克的答案是正确的。

  

任何属于Outer的内容都应有权访问Outer的所有公共或私人成员。

因此,您可以做两件事,要么将var声明为static,要么使用外部类实例的引用来访问“ var”(因为friend class or function也需要引用访问私有数据)。

静态变量

如果您不希望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();

}

Output- var: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);

}

Output- var:1

编辑-外部链接是指向我的博客的链接。