【问题标题】:Can't access inner class member with outer class object无法使用外部类对象访问内部类成员
【发布时间】:2017-11-13 02:23:05
【问题描述】:
#include <iostream>

class Outer
{
    int o;
public:
    void setOuter(int o)
    {
        this->o=o;
    }
    class Inner
    {
    public:
        int i;
        int retOuter(Outer *obj)
        {
            return obj->o;
        }
    };
};

int main(int argc, char **argv) {
    Outer::Inner obj;
    obj.i=20;
    std::cout<<"Inner i = "<<obj.i<<std::endl;

    Outer *obj1=new Outer;
    obj1->setOuter(40);
    std::cout<<"Outer o = "<<obj.retOuter(obj1)<<std::endl;

    obj1->Inner::i =50; //Access the inner class members by Outer class object!
}

除了最后一行之外,上述代码中的所有内容都很好。为什么我无法使用外部类对象访问内部类成员?外部类对象应该具有class Outer 的所有公共成员访问权限以及当我创建一个内部类对象时的行为,因为它包含在外部类中!

【问题讨论】:

    标签: c++


    【解决方案1】:

    Inner 只是在不同范围内定义的类。跟说没什么区别

    class Inner
    {
    public:
        int i;
        int retOuter(Outer *obj)
        {
            return obj->o;
        }
    };
    

    然后

    Inner::i =50
    

    这显然是不可能的,因为i 不是static

    声明内部类不会自动为外部类声明该类型的成员,您可以使用该语法访问该成员。

    现在,类似:

    class Outer
    {
        int o;
    public:
        void setOuter(int o)
        {
            this->o=o;
        }
        class Inner
        {
        public:
            int i;
            int retOuter(Outer *obj)
            {
                return obj->o;
            }
        } innerMember;
        //    ^^^
        // declare a member
    };
    
    int main(int argc, char **argv) {
        Outer *obj1=new Outer;
        obj1->innerMember.i =50; //Access the inner class members by Outer class object!
    }
    

    会起作用的。

    【讨论】:

    • 好的。那么Outer类对象如何拥有自己的Inner类i值呢?我是否需要为内部类创建对象obj1-&gt;Inner objInner; objInner.i =50;
    • @SoumyajitRoy 正如您的代码一样,Outer 类没有 Inner 类型的成员。请参阅我的剪辑以了解如何做到这一点。
    • 是的,您的代码 sn-p 完美运行。为了澄清我的理解,内部类不像其他普通成员那样是外部类的成员。正确的?实际上,内部类定义作为innerMember 的类型工作。我对吗?同int innerMember
    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2011-08-11
    • 2018-06-26
    • 2012-09-02
    • 2013-10-21
    相关资源
    最近更新 更多