以下示例演示了我的问题。我试图从文件中反序列化[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的友谊(只有它的方法/属性)。
答案 0 :(得分:0)
友谊不是传递性的,不是继承的。这里的常见设计是在父Parser
类中公开受保护的setter,而后者将调用底层类的私有setter。