• 締切済み

vector<int> に Serialize を使いたい!!

VC++ の MFI で SDI をやっています。 Doc クラスにある整数のメンバ変数   CArray<int, int> nums を Serialize を使って読込・保存するには void Cなんかの名前Doc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: 格納するコードをここに追加してください。 nums.Serialize(ar); } else { // TODO: 読み込むコードをここに追加してください。 nums.Serialize(ar); } } とすることができます。 ここで質問です。 もし Doc クラスにある整数のメンバ変数   vector<int> nums についても Serialize を使って同様に読込・保存するには どのように記述したら良いのでしょうか。

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

CArchive& operator<<(CArchive&, const vector<int>&); および CArchive& operator>>(CArchive&, vector<int>&); を多重定義するということでどうでしょうか? より一般的には、 template <class T, class Allocator> CArchive& operator<<(CArchive&, const vector<T, Allocator>&); template <class T, class Allocator> CArchive& operator>>(CArchive&, vector<T, Allocator>&); でしょうね。

k1220011_2005
質問者

お礼

ありがとうございました! 初心者の自分には多重定義は難しそうなので、 もう少し成長してからトライしてみます!!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • serializeについて

    VCのFILE処理はC言語と大きく異なっているようで戸惑っています。 serializeをオーバーライトすればいいとありました。 例えば CTestAppDoc::Serialize( CArchive& ar ) というようなメンバ関数ができます。 それで質問なんですけど、serializeを使ったファイルの読み書きは基本なんですか。 それとも、他に基本のコードがあるのでしょうか? 次にメンバ関数の利用には、そのクラスが必ずインスタンスを持つ必要があるのでしょうか。 もしあるのなら、CArchive のインスタンスはどこで作成されているのでしょう?

  • CArrayのシリアライズの方法を教えてください。

    VC++ 2003, MFC SDIです。 Windowsでプログラムを始めて数週間のものです。 CMyDataという自分で作ったクラスのインスタンスを要素にもつCArrayを作りました。 CArray <CMyData, CMyData> myArray; と宣言して一応要素の追加削除、データの取り出しはスムーズにできるのですが、保存、読み込みの方法がわかりません。 CMyDataのメンバ変数の中身はすべてCStringなので、ドキュメントクラスのSrialize関数内で、ループで、ar.WriteString(myArray[i].getName())見たいに要素をひとつずつテキストに書き込んだり、読み込んだりはできるのですが、できればmyArrayをバイナリで一発保存、読み込みができれば楽かなと思います。 どのドキュメントを読んでもCArrayはSerializeをサポートしているって書かれているんですが、具体的なやり方が見つかりません。 ちなみにCMyDataはCObjectを継承できませんでした。継承すると、myArrayに追加できません。ここもちょっとわからないんですが。。。 どなたかご教授お願いします。

  • ダイアログベースでのデータの保存について

    環境 WIN98 VC++6.0 MFC にて SDIベースで基本クラスをCFormViewとした場合、フォーム上のエディットボックスに入力したデータを保存する方法として以下のサンプルコードがありました。 void CVcdtstDoc::Serialize(CArchive& ar) { int i; //■追加 CString endmark="___end___"; //■追加 if (ar.IsStoring()) { // TODO: この位置に保存用のコードを追加してください。 //------------------------------■ここから追加 for(i=1; i<=maxct; i++){ ar << mydata[i]; } ar << endmark; //------------------------------■ここまで追加 } else { // TODO: この位置に読み込み用のコードを追加してください。 //------------------------------■ここから追加 for(i=1; i<=100; i++){ ar >>mydata[i]; if(mydata[i]==endmark){ --i; break; } } maxct=i; if(maxct>0) pos=1; //------------------------------■ここまで追加 } } 同様にシリアル化をダイアログベースのプログラムでやりたいのですが、どのようにすれば良いのでしょうか? ヒント程度では分からないと思いますので、具体的お願いしたいのですが、また参考サイトなどもあればお願いいたします。

  • VC++:ウィンドウキャプションの変更

    環境:VC++6/MFC ファイルを開こうとしたときにファイル形式を確認して、対応していないときは中断する。 というコーディングをしたいです。 どうしたらいいんでしょう? ファイルオープン部のコード void CProjectDoc::Serialize(CArchive& ar) {  if (ar.IsStoring())  {   // TODO: この位置に保存用のコードを追加してください。  }  else  {   // TODO: この位置に読み込み用のコードを追加してください。   m_FileName = ar.GetFile()->GetFilePath();   int nRet;   char szErrMsg[128];   nRet = LoadFile(m_FileName);   if(nRet == 1) {    // ファイルオープンエラー    wsprintf(szErrMsg,"ファイル %s が開けません",m_FileName);    MessageBox(NULL,szErrMsg,"LogViewer",MB_OK | MB_ICONERROR);    // ここで何かする?    return;   }   UpdateAllViews(NULL);  } }

  • 理想的なハッシュ関数

    C++での質問です. たとえば以下のようなmyclassクラスがあり, メンバ変数のx,y,ar[10]を使って 0~ 1020 の範囲のハッシュ値を得たいのですが, どうも偏った値しか得られません. できるだけ指定範囲の中で均一に値を生成するような myclass::hush() を作るとしたらどのような計算方法が考えられるでしょうか? ちなみにx,y,ar[10]の整数型変数はいずれも 0~50程度の値です. const int modnum = 1021 ; /* 素数 */ class myclass{ private: int x; int y; int ar[10]; public: int hush(); }; int myclass::hush(){ int sum; /* ここで x, y, ar[10]を使った計算を行う */ sum = /* x, y, ar[10]から導き出した値 */ return sum % modnum; }

  • getId()がint?

    androidプログラミングを勉強中です。教本の中で、 メンバ変数 private int mOp; と定義し、 クリックイベントのメソッド内にて mOp = view.getId(); としています。 さらに別のクリックイベント内にて switch (mOp) { case R.id.button_plus: [処理] としています。 やりたい事は理解できるのですが、getId()がなぜintで定義されているのかわかりません。 getId()で取得できるのがR.id.button_plusならばString型ではないのでしょうか? intだとするとどんな整数が入っている事になるのでしょうか? 根本的に勘違いをしているのかもしれません。 おわかりになる方がいらっしゃいましたらお教え頂けると幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Serialize(CArchive& ar)にて

    VC2008のMFC:SDIにて作成しております。 以下入力画面を作成しました。 <入力画面> 氏名     エディットボックス(DDX変数:m_Name) 郵便番号  エディットボックス(DDX変数:m_Yubin) 住所     エディットボックス(DDX変数:m_Jusho) として画面を作りました。 <シリアライズ関数にて> void CP208_JushoDoc::Serialize(CArchive& ar) { //ビューのポインタを取得します。 POSITION pos = GetFirstViewPosition(); CJushoView *pView = (CJushoView*)GetNextView(pos); if (ar.IsStoring()) { // TODO: 格納するコードをここに追加してください。 //エディットボックスに入力された値を取得する。 pView->UpdateData(TRUE); //メンバ変数の値をファイルに書き込み ar << pView->m_Name; ar << pView->m_Yubin; ar << pView->m_Jusho; } else { // TODO: 読み込むコードをここに追加してください。 //ファイルからメンバ変数に読み込み ar >> pView->m_Name; ar >> pView->m_Yubin; ar >> pView->m_Jusho; //エディットボックスに値を表示する pView->UpdateData(FALSE); } } ======↑コードココまで。 のコードを実装しております。 <質問> 各エディットボックスに、簡単な値を入力し「名前を付けて保存」しました。 ・入力内容 氏名:eeee 郵便番号:rrr 住所:fff 出力されたファイル(test.txt)を確認したところ、 「 eeee rrr fff」 とスペースらしきものが含まれた形で保存されていました。 書き込み時は、「arのメンバ変数にでも追記されて最終的な結果が出力されたかな」の認識でいます。 ただ、「メニューバーのファイルを開く」を選択して「test.txt」を読み込んでみたところ正しく表示されました。(メニューバーのコード等は一切触っておりません。) ・結果 氏名:eeee 郵便番号:rrr 住所:fff このように読み込まれたのです。なぜ  「eeeeまでが一区切りとコンピューターが判断し、m_Nameに代入できたのか?」 というのが知りたいのです。(m_Yubin、m_Jushoも正しく代入されているため問題なく表示できています。) csvみたいに、半角スペースで区切ってるのかと思い、 「氏名:aaaa▲bbbb」と、入力し保存後、ファイルを読み込んでみましたが、 正しく「氏名:aaaa▲bbbb」と表示されました。(▲は半角スペース) 一体、どういう理屈で、「eeeeまでが一区切りとコンピューターが判断し、m_Nameに代入できたのか?」 動いているのでしょうか? arに、文字列が格納される仕組みがわかれば解決するかなと思っているのですが、 http://msdn.microsoft.com/ja-jp/library/dz8k76ze … ココを参考にしたのですが、気になってる部分はわかりませんでした。 どなたかご教授よろしくお願いします。

  • c言語のソースコードを教えて下さい

    キーボードから10個の正整数値を読み込み,合計値を表示するプログラムを作りなさい。 ただし,キーボードから読み込んだ値はint型変数xにしまわれるものとし,変数はこのxと回数を数えるint型変数countと合計値をしまうint型変数sumのみを用いることとする。 このプログラムのソースコードを教えて下さい。 解説もよろしくお願いします。

  • VB.Netの大域変数

    VB6ではイベント制御のため、共通モジュールに大域変数を Public gFlag As Integer のように記述していました。 最近になってVB.Netをはじめましたが、この大域変数がうまく動いてくれません。 とりあえずVB6の共通モジュールはクラスを追加して行うとあり、 クラスを追加して、そこで上記のようにPublicで宣言しました。 ところがFormのコードで使うと宣言されていませんと出ます。 そこで色々と調べてPublicは外部に公開されるメンバ??らしい ということは分かったのですが、クラス自体さっぱりです。 とりあえずクラスのお勉強は後回しにするとして、 大域変数はどのようにすれば使えるようになるのか教えて下さい。

  • STL vectorの初期化

    STL vectorの初期化についてなんですが 以下のようなクラスのprivateなメンバ変数としてvectorを定義し それをメソッド内のループ処理にて初期化しながら使用したいのですが 初期化の仕方が分かりません。コンストラクタを呼べば初期化されるようですが 以下のようにヘッダとソース内で2度同じような宣言をしてしまっても問題ないのでしょうか? //=== test.h === class test { private : vector<int> array; public : int fnc(); }; //=== test.c === int fnc() { for (int i = 0; i < 10; i++) { //★ここで初期化したい vector<int> array;  ←これで問題ないか? for (int j = 0; j < 10; j++) { array.push_back( md ); } } } C#などでは宣言とインスタンス生成を別に分けられたのですがC++も同様の事が出来るのでしょうか? 一応「array = new vector<int>;」といれて見たのですがエラーが出ました。

このQ&Aのポイント
  • MFC-670CDでの印刷ができない問題について相談いただきました。印刷はしているようですが白紙で出力されるとのことです。トラブルの原因や試したことについてお知らせください。
  • お困りの状況はMFC-670CDでの印刷が白紙で出力されるということです。印刷は実行されているようですが問題なく印刷されない状態です。解決策を探るためにトラブルの経緯や試したことについてお教えください。
  • ブラザー製品のMFC-670CDでの印刷不具合についてのお悩みですね。印刷は行われているようですが白紙で出力されるという現象が起きています。トラブルの経緯や試したことについて教えていただけますか?
回答を見る