2016-10-26 8 views
0

を通じてクラスを初期化私はプライベートなデータメンバーの多くの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を使用すると、すべてのメンバー変数が他のすべてのものに公開されますが、必要ない、または必要ではありません。

- 初期化関数を使用しても問題ありませんが、私はその関数にアクセスする他の何か(友人関数かもしれません)を望んでいませんか?

アイデアは高く評価され、私はどこでできるかを明確にします。申し訳ありませんが、コードはあいまいではありません。しかし、うまくいけば、問題の要点を見るだけで十分です。

ありがとうございます。

答えて

0

あなたの説明はシリアル化/逆シリアル化のようです。 (XML)設定ファイルからオブジェクトデータをバックアップ/取得することは非常に一般的です。多分、良いスタートはBoost Serialization Tutorialです。

さらに基本的に、あなたの質問に対する答えは「クラスの友人の関数/クラスを使用する」ことができます。

+0

はい、コンセプトに名前を付けていただきありがとうございます。これは実際にシリアル化です。それは正しい方向に私を向けるのに役立つはずです。 – SomeGuy

+0

はい、正しい名前を付けることが重要です。また、あなたの投稿のタイトルに「シリアライゼーション」を追加することもできます。別の例は、この記事がC++であっても私が言及するC#です。私は基本的にXMLSerializerのメカニズムを使用しました。このメカニズムでは、ゲッターとセッター、およびパラメーターのないコンストラクターを使用して、パブリック "プロパティ"(メソッド呼び出しを通じてアクセスされるフィールド)が必要です。 [Serializableに関する質問](http://stackoverflow.com/questions/2982376/why-is-serializable-attribute-required-for-an-object-to-be-serialized)の情報だけを見てください。 – NGI

+0

私はXMLファイルに言及しましたが、バイナリフォーマッタ/バックアップファイルもあります。しかし、私は、(私が知っている限り)ほとんどの場合、あるインスタンスのデータが連続しており、ファイル全体に広がっていないと仮定します。各データメンバーは、このメンバーがどのインスタンスに属しているかを再指定する必要があります – NGI