CArrayについて

解決


うま  2005-03-12 05:45:50  No: 56654

class aaa{
/*------------

-------------*/
};

class bbb{
/*------------

-------------*/
  CArray<aaa, &aaa> aArray;
}

class ccc{
/*------------

-------------*/
  CArray<bbb, &bbb> bArray;
}

class ddd{
/*------------

-------------*/
  CArray<ccc, &ccc> cArray;
}

このような形で独自クラスを配列化しているのですが、
配列化したクラスでAddを使用するとエラーが出ますした。
エラー内容は afxtempl.h 内の処理で、operator =を処理できませんとの事。
単純に各クラスにoperator = (下記)を追加しましたが、それでもafxtempl.h で引っかかります。

void xxx::operator = (xxx& dest){
/*------------
略 各メンバのコピー
------------*/
xArray.Copy(dest.xArray);
}

------------
c:(略)\afxtempl.h(64): error C2679: 二項演算子 '=' : 型 'const bbb' の右オペランド
を扱う演算子が見つかりません (または変換できません)。
------------
該当行のソース↓
  *pDest++ = *pSrc++;

operator = は全クラスに追加したのですが。。。
しかもエラーはbbbのみ。何故???
cArray.Copy(dest.cArray) を削除すればエラーが消えるのですが、
これでは operator = でメンバのコピーが正常にできません。
どんどん混乱してきてどうしようかという状態なのですが…

どなたか解決策、対応をご教授お願い致します。


うま  2005-03-12 06:30:59  No: 56655

えぇとすみません。情報追加です。
環境はVisualStudio.NET 2002 SP1 で MFCを使用して作成しています。

具体的にクラスaaaはファイル情報、bbbはフォルダ情報、
cccがアプリ情報、dddがその総括になっています。
初回起動時にPCにインストールされているアプリ数分×
そのインストールフォルダ以下を舐める仕組みになります。
簡単なエクスプローラのようなモノです。

addを使用せず、SetSizeでメモリ確保をしてから
ポインタを引っ張りまわす方法で(operator =,Add未使用で)
回避できるようですが、
フォルダの中にアプリに対応するファイルがいくつあるかは
走査完了するまで分からないわけで、
走査している最中にファイル情報とフォルダ情報の初期化を
やってしまえた方が楽じゃないかなぁと。
そうするといくつ追加されるかが分からないのと、
初回のみならば多少の遅い処理も大目に見るつもりでAddの登場となりました。

結果、泥沼化しています_|‾|○

また、CListではなくCArrayを使用している理由は以下のとおり。
上記のadd/copyはインストール直後の起動1発目のみで、
以後は最初に作成したデータをロードして使いまわします。
その際は個数も上限が決まっている為、SetSizeでメモリを確保してから読み込みます。
読み込み後の使いまわしは配列の方が何かと使い勝手が良いのです。

と言うより既にサンプルデータから読み込み、動作するところまで作ってあります。
では初期化して正しいデータを作成しよう、というところでこのエラーです。
今からCArrayに変更するのはかなり骨が折れるので、
良い方法があればよいのですが…


dog  2005-03-12 19:56:51  No: 56656

CTypedPtrArrayを使えばいいのではないでしょうか。
違ったら済みません。


RAPT  2005-03-12 21:23:18  No: 56657

略されている部分に原因がありそう。
特にコピーの実装部。
コピーコンストラクタやoperator= の実装だとか。

まずは、コンパイル・再現可能な最小のコードを作成し、検証してみることを
お奨めします。


REE  2005-03-14 20:49:07  No: 56658

以下の様にconstを追加すればよいのでは?

void xxx::operator = (const xxx& dest){


うま  2005-03-15 00:19:19  No: 56659

返信が遅くなり申し訳ありません。
土日とも外出でPC起動してませんでした。

その後自分の質問を見失い〜・・・検索でポインタを突っ込む云々の記述を見つけて実装、何とか解決しました。

>dogさま
用途からして CTypedPtrArray の方が向いていますね。

>RAPTさま
略している箇所はintやCString等のクラスメンバのコピーのみ、
xArray.Copy() は標準関数です。
時間が出来たらじっくりソースとにらめっこしてみます。

>REEさま
可能性ありますね… 試してみます。

お忙しいところありがとうございました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加