-1

ファイルから/へのオブジェクトの読み取りと書き込みの両方のクラスを作成したいと考えています。この目的を達成するために、テンプレート キーワードを使用します。

 template<class T>
 class A{
  private:
   std::string filePath;//This will use to indicate the path of proper file.
  public:
    void save(T a){
     //write the given object to the file. The path is fetched by filePath
    }
    std::list<T> read(){
    //read the file and put each line in the list. The path is fetched by filePath
    }
    A(std::string path):filePath(path){}
 };

このメソッドを使用する場合、int、float などのプリミティブ型で使用した場合はすべて問題ありません。しかし、円、長方形などのオブジェクトを操作したいときに問題が発生します。問題を解決するにはどうすればよいですか

4

1 に答える 1

4

おそらくシリアル化が必要です(または、アプリケーションのチェックポイントなどの永続性も必要です...)。データ酸洗と呼ばれることもあります。

s11nライブラリを使用できます(C++ データをシリアル化するためのテンプレートを提供します)。

また、独自のクラスでoperator <<andを定義することもできます。operator >>Rectangle r;std::cout << r;std::cin >> r;

JSON(またはYAMLまたはXML ...)などのテキストシリアル化形式を検討できます。たとえば、 jsoncppを使用します

任意のグラフをシリアライズすることは、ツリーのようなデータ構造をシリアライズすることよりもはるかに困難です (循環参照と共有ポインターのため....)。

C++ でシリアライゼーション機能を自動的に取得する簡単な方法はありません。Personクラスの一部で、人間同士の結婚を表していると想像してください。効率上の理由から、(タイプ の) 2 つのテーブルが必要な場合があります。1 つはstd::map<(Person,Person>妻をすべての夫にマッピングし、もう 1 つは夫をすべての妻にマッピングします (ある女性の夫またはある男性の妻を頻繁に照会するため、両方のテーブルが必要です)。 . しかし、夫と妻のペアのセットだけで、これらのテーブルの両方をシリアライズしたくないでしょう (それらはどういうわけか「冗長」です)。これは、シリアル化が多くの場合アプリケーション固有であることを示しています。

于 2013-09-28T12:42:29.687 に答える