继承嵌套类不允许访问嵌套类'所有者(类)非公开数据

时间:2016-03-14 14:19:19

标签: c++ parsing c++11 inheritance design-patterns

以下示例演示了我的问题。我试图从文件中反序列化[complex]对象,并且该对象(类)应该只为最终用户提供const getter。所有反序列化过程都应该由Parser接口完成,该接口可以是JSONParser和/或XMLParser(使用它们各自的第三方解析库)。

#include <string>

namespace tmx
{
    class File
    {
    // The getters
    public:
        static File& from(std::string path);

        const int getData1();
        const int getData2();
        // ...

    // The "hidden" (non-public) setters, used in the parsing
    protected:
        void setData1(int v);
        void setData2(int v);

    // The hidden constructors. File class must be created through the static function
    private:
        File();
        File(std::string path);
        File(const File& copy);

    // The public Parser, so that it can be inherited
    public:
        class Parser
        {
        public:
            virtual ~Parser() { };
            virtual void parse(File& file) = 0;

            void test(File& file)
            {
                file.protectedData1 = 123; // Access protected data normally! :)
            }
        };

    // The "hidden" (non-public) file data
    protected:
        int protectedData1;
        int protectedData2;
        // ...
    };

    class XMLFilePaser : public File::Parser
    {
    public:
        void File::parse(File& file) override
        {
            file.protectedData1 = 123; // Cant access protected data :(
        }
    };
}

正如我们所看到的,嵌套的Parser类可以自由访问File的数据,无论它是私有的还是受保护的,但是继承的解析器都不能。是什么原因,我怎么能完成这个没有使用BOOST

就我而言,我有点可以使用frienship(制作Parser的文件朋友),但仍然,我不能继承Parser的友谊(只有它的方法/属性)。

1 个答案:

答案 0 :(得分:0)

友谊不是传递性的,不是继承的。这里的常见设计是在父Parser类中公开受保护的setter,而后者将调用底层类的私有setter。