• ベストアンサー

CArrayの要素としてCStringArrayを使うことは...

MFCのCArrayを使って以下のことをしようとすると エラーになります。 コード: CArray <CStringArray, INT_PTR> array; CStringArray str; array.Add(str.Add("aaa")); エラー内容: C2582: 'operator '=' 関数を 'CStringArray' で使用できません。 CArrayの要素としてCStringArrayを使うことは 出来ないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • akanekor
  • ベストアンサー率52% (102/194)
回答No.1

結論は、出来ません。 CArrayを用いるには operator=(..) が定義されていないと、使えませんが、 CStringArrayの定義(AFXCOL.H)に 定義が無いので無理です。 (AFXCOL.H書き換えれば、一応できるけど(==; やらないように、 ) 変わりに、CObArray使ってくださいな(=w=ノ (入れてね) #include <Afxcoll.h> (使い方) CObArray array; CStringArray str; array.Add(&str); //扱いがポインタになるので注意 後、 CStringArray::Add()は 追加した要素のインデックスです。 array.Add(str.Add("aaa")); こんな記述はできませんよ。

その他の回答 (1)

  • akanekor
  • ベストアンサー率52% (102/194)
回答No.2

下の文の一部修正 (==; CStringArray::Add()の戻り値は、 追加した要素のインデックスです。 array.Add(str.Add("aaa")); こんな記述はできませんよ。

関連するQ&A

  • MFC CArray in CArray

    配列の中に配列を入れるようなプログラムを作成しています。 typedef CArray<Image, Image&> ARRAY_IMAGELIST; typedef CArray<ARRAY_IMAGELIST*, ARRAY_IMAGELIST*> ARRAY_MAINLIST; ARRAY_MAINLISTm_arrayMain; のようにしたいのですが、エラーが出ます。 何故かうまくいきません。 typedef CMap<int, int, ARRAY_IMAGELIST*, ARRAY_IMAGELIST*> MAP_IMAGELIST; MAP_IMAGELIST m_mapImageList; のようにMAPにするとうまくいきます。 配列の中に配列を入れられないのでしょうか?

  • C++のコンストラクタを使った自動ポインタでoperator関数の使い

    C++のコンストラクタを使った自動ポインタでoperator関数の使い方で分からないところがあります。 環境下はVisual C++でC/C++のWin32コンソールアプリケーションを使って行っています。 下記のコードで実行させています。やっていることは文字列を反転させて表示させるだけのことです。 #include "stdafx.h" #include <string> #include <iostream> class AutoPtr { char *ptr; public: AutoPtr():ptr(0) { } ~AutoPtr() { delete [] ptr; } // char *operator=(char *ptr) { delete [] this->ptr; this->ptr = ptr; return this->ptr; } operator char *(){ return ptr; } char &operator[](int index) { return ptr[index]; } }; void reverse(char *str) { int i, n; AutoPtr work; n = strlen(str); work = new char[n+1]; strcpy(work, str); for(i=0; i<n; i++) { str[i] = work[n-i-1]; } printf("%s\n", str); } int _tmain(int argc, _TCHAR* argv[]) { reverse("ABCDEFG"); return 0; } これを実行させると、reverse関数のfor()文の、str[i] = work[n-i-1];を実行させた所で実行エラーになってしまいます。その前の、strcpy(work, str);でworkにstrの内容が正常にコピーされているところまでは確認できています。operator関数の、 char &operator[](int index) { return ptr[index]; } で、operator[]はAutoPtrを配列のように扱っているはずなのですが、何故かstr[i] = work[n-i-1]; の所で実行エラーになってしまいます。 operaror関数の書き方が悪いのか、何が原因なのか分かりかねています。御経験のあるかたは、御教示いただけたらと思っています。 よろしくお願い致します。

  • C++のoperator関数でのキャストする場合の書き方がまだよく理解

    C++のoperator関数でのキャストする場合の書き方がまだよく理解できていません。 下記のコードで、 //ここから #include "stdafx.h" #include <string> #include <iostream> class AutoPtr { char *ptr; public: AutoPtr():ptr(0) { } ~AutoPtr() { delete [] ptr; } // char *operator=(char *ptr) { delete [] this->ptr; this->ptr = ptr; return this->ptr; } operator char *(){ return ptr; } char &operator[](int index) { return ptr[index]; } }; void reverse(char *str) { int i, n; AutoPtr work; n = strlen(str); work = new char[n+1]; strcpy(work, str); for(i=0; i<n; i++) { str[i] = work[n-i-1]; } printf("%s\n", str); } int _tmain(int argc, _TCHAR* argv[]) { char str[] = "ABCDEFG"; reverse(str); return 0; } //ここまで 2番目のoperator関数の定義ですが、 operator char *(){ return ptr; } これは多分、reverse()関数中の、 strcpy(work, str); のworkの展開に用いられると思うのですが、 機能としては、「operator char *」はAutoPtrをchar *にキャストするために使われているらしいのですが、何故この書き方でAutoPtrをchar *型にキャストできるのかがいまいち分かりません。また、2番目のoperator関数の記述「operator char *()」はどこまでが型で、どこからが関数の定義と見なせばよいのでしょうか? 何か勘違いしているかもしれません。理解されている方、御教示いただければと思っています。 よろしくお願い致します。

  • ファイルから Carray<int,int> に読み込みたい

    1 2 3 4 5 xxxxxx のように、数字を記録したファイル(語尾はxxxxxxの目印あり)を Carray<int, int> に読み込ませるには、どういう関数を、どう使えばいいのでしょうか。 ちなみに MFC のダイアログベースで作成しています。 初心者で、マイクロソフトのヘルプを見てもサッパリわからず、 困っています、助けてください。

  • 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に追加できません。ここもちょっとわからないんですが。。。 どなたかご教授お願いします。

  • 動的な構造体配列の初期化

    以下のように構造体を new で動的に確保したときに 構造体の中身(char bbb[10], int ccc)をゼロで初期化したいのですが ZeroMemory を使用するとCArrayのAdd()を使用したときにエラーになってしまいました。 何かよい方法がありましたら教えて下さい。お願いいたします。 # 簡単にイメージですが・・・ typedef struct { CString a; CString b; }aaa_t ; struct s_aaa{ char bbb[10]; int ccc; CArray<aaa_t,aaa_t> m_aaaArray ; } s_aaa *StructB; StructB = new s_aaa [10];

  • [C]char型のダブルポインタ

    粗雑で申し訳ありませんが、 以下のソースをコンパイルできましたが、 うまく実行できません。 自分なりに間違いがないと思うのですが、 間違い等をご指摘頂ければ助かります。 #include <stdio.h> void func(char **ptr) ptr[][10] か (*ptr)[] なら通る *ptr[] は通らない { printf("----- func -----"); printf("%s\n", *ptr); printf("%c\n", **ptr); putchar('\n'); } int main(void) { char str[5][10] = {"AAAAA", *str[] にすると func で **ptr で通る "BBBBB", "CCCCC", "DDDDD", "EEEEE", }; printf("----- main -----"); printf("%s\n", *str); printf("%c\n", **str); putchar('\n'); func(str); return (0); } 実行結果 ----- main ----- AAAAA A ----- func ----- Bus error (core dump) 関数への受け渡しで、型が違うというお叱りを受けますが、 コンパイルはできました。 コンパイラはCCです。 ではよろしくお願いします。

  • array_mapの再帰処理がうまく行かない

    長文で失礼します。 array_mapでの再帰処理がうまく行かないのでどこが間違っているか教えてください。 まず、このような配列があります。配列の中に配列があります。 $ary = array(1, 2, null, array("a", null, "c")); この配列の中のnullを"なし"という文字列に変換したいです。 array_mapを使って再帰的にやってみました。 まずはうまく行ったコードから。 ------------------------------------------------------ $ary = array(1, 2, null, array("a", null, "c")); var_dump(null2Nashi($ary)); // nullを"なし"に置換する関数 function null2Nashi(  $in_array ){  if(is_array($in_array)){   return array_map("null2Nashi", $in_array);  } else {   if ($in_array === null){    $in_array = "なし";   }   return $in_array;  } } ------------------------------------------------------ 結果はnullが"なし"に変換されました array (size=4)  0 => int 1  1 => int 2  2 => string 'なし' (length=6)  3 =>   array (size=3)    0 => string 'a' (length=1)    1 => string 'なし' (length=6)    2 => string 'c' (length=1) そしてこの"なし"をコード内で指定するのではなく引数で指定したいと思って無名関数を使って以下のコードにしました。 ------------------------------------------------------ $ary = array(1, 2, null, array("a", null, "c")); var_dump(null2Str($ary, "なし")); // nullを指定文字列に置換する関数 function null2Str(  $in_array, // null値を含む配列  $in_str // null値を変換したい文字列 ){  $n = function($n_array) use($in_str){   if(is_array($n_array)){    return array_map($n, $n_array); //…(1)   } else {    if ($n_array === null){     $n_array = $in_str;    }    return $n_array;   }  };  return $n($in_array); } ------------------------------------------------------ 結果はnullは何も変換されませんでした。 array (size=4)  0 => int 1  1 => int 2  2 => null  3 =>   array (size=3)    0 => string 'a' (length=1)    1 => null    2 => string 'c' (length=1) どうやら(1)のarray_mapが動作していないようです。要素を分解せずに$nの無名関数に渡さずにそのまま第2引数を返しているだけみたいです。 何か対応方法があるでしょうか? どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • ArrayListに多次元配列

    ArrayListに多次元配列の変数を格納したのですが、取り出し方がわからず困っています。 ----------------------------------------------- String[][] str = {{"aaa","bbb","ccc","ddd","eee","fff"}, {"aaa","bbb","ccc","ddd","eee","fff"}, }}; ArrayList array = new ArrayList(); array.add(str[0]); array.add(str[1]); ----------------------------------------------- 上記の場合で、str[0][2];を取得する方法がわかりません。 java初心者なのでおかしな質問かもしれませんが、宜しくお願いします。

    • ベストアンサー
    • Java
  • ポインタについて

    C言語のポインタについての質問です。 main関数内が int main(void){ int data[10],datum,index,result,*ptr; ptr=data; ~~以下略~~ となっています。 これの「ptr=data;」を配列要素を用いて書き直しなさいという問題があるのですが、問題の意図がよくわかりません。 私としては「ptr=&data[0];」と書き変えろという意味なのかと思ったのですが、問題の意図に適しているでしょうか? 私の考えが間違っていましたら、問題の意図について指摘して下さい。 宜しくお願いします。