Search code examples
c++classobjectc++11nested-class

how to call variable from a nested class in C++


So my code is kind of like this

class foo1
{
    public:
        foo1()
        {
            a = "text";
        }

        void getString()
        {
            return a;
        }
    private:
        string a;
};

class foo2
{
    public:
        foo2()
        {
            foo3 boo3;
        }
        class foo3
        {
            public:
                foo3()
                {
                    foo1 boo1;
                }
            private:
                foo1 boo1;
        };
    private:
};

int main()
{
    foo2 object;
    cout << /* ??? */ ;
}

first off, is there any problem with the code structure in the classes, second, what should I put in the place of the comment to display string a in the foo2 object i initiallized in int main() ?


Solution

  • There are multiple issues with the code, I'll explain them with code comments

    class foo1
    {
        public:
            //use initializer lists to avoid extra copying
            foo1() : a("text") 
            {
            }
    
            //change return type from void to a const reference to string
            const string & getString()
            {
                return a;
            }
        private:
            string a;
    };
    
    class foo2
    {
        public:
            //use initializer lists to avoid extra copying
            foo2() : boo3() 
            {
            }
            class foo3
            {
                public:
                    //use initializer lists to avoid extra copying
                    foo3() : boo1()
                    {
                    }
    
                    //you need a function that will allow access to the private member. Returning a const reference avoids extra copying
                    const foo1 & boo()
                    {
                        return boo1;
                    }
    
                private:
                    foo1 boo1;
            };
    
            //you need a function that will allow access to the private member
            const foo3 & foo()
            {
                return boo3;
            }
        //you need to save the foo3 object in the class to be able to use it later
        private:
            foo3 boo3;
    };
    
    int main()
    {
        foo2 object;
        cout << object.foo().boo().getString();
    }
    

    Now this is how you access the string:

        cout << object.foo().boo().getString();
                \__________/ \___/ \_________/
                     ^         ^        ^---- get the string from the foo1 object
                     |         |---- get the foo1 object from the foo3 object
                     |---- get the foo3 object stored in "object"