【问题标题】:Initialising class through a parser通过解析器初始化类
【发布时间】:2016-10-26 02:50:59
【问题描述】:

我有一个类,我将其命名为 CObject,其中包含很多私有数据成员。

class CObject
{
   private:
   int a, b, c, d, e, f, g, h, i;
   string j;
   ...More data types etc
};

还有另一个类,它解析初始化文件递归地查找对象的成员。这个类满足库提供的虚拟类。

class CParser
{
   public:
    void beginParsingObject()
    {
      //etc
    }

    void parseObjectMembers(string name, int a)
    {
       //Found a member variable of the object!
    }

    void finishParsingObject()
    {
       //Finish up parsing the object
    }
};

因此,“parseObjectMembers”将被调用的次数与 CObject 类中的成员变量一样多。

当解析器在它的数据文件的条目中找到它的下一个成员变量时,CObject 类将填充它的成员变量。

这是我的困惑:

在读取数据时在 CObject 中设置成员变量的好方法是什么?

- 使用构造函数意味着缓存传入的每个值,并在完成解析对象时构造对象 - 不太令人满意,因为有很多,我希望解析器非常通用。

-在 CObject 类中使用 getter 和 setter 会将所有成员变量暴露给其他所有不需要或不需要的变量。

-使用初始化函数会很好,但我不希望其他任何东西可以访问该函数 - 也许是朋友函数?

感谢任何想法,我会在我可以澄清的地方进行说明。抱歉,代码晦涩难懂,也不是很充实,但希望足以看到问题的症结所在。

谢谢

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    您描述的似乎是序列化/反序列化。从(XML)配置文件中备份/检索对象数据是很常见的。也许一个好的开始是Boost Serialization Tutorial

    基本上,您的问题的答案可能是“使用类本身的‘朋友’函数/类”。

    【讨论】:

    • 是的,感谢您为概念命名。这确实是序列化。这应该有助于为我指明正确的方向。
    • 是的,提供正确的名称很重要。也许还可以在您的帖子标题中添加“序列化”。另一个例子是我提到的 C#,即使这篇文章是 C++ 。我基本上使用了 XMLSerializer 的机制,它需要带有 getter 和 setter 以及无参数构造函数的公共“属性”(通过方法调用访问的字段)。只需查看question on Serializable 的信息即可。
    • 我提到了 XML 文件,但也有二进制格式化程序/备份文件。但是,我假设(据我所知)大多数情况下,一个实例的数据将是连续的,不会散布在整个文件中。每个数据成员都需要重新指定该成员属于哪个实例
    猜你喜欢
    • 2020-09-11
    • 1970-01-01
    • 2015-08-16
    • 2016-09-13
    • 2017-06-19
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    相关资源
    最近更新 更多