Aという構造体のデータをBという構造体にコピーする関数がありました。
追加改修で、Cという構造体のデータをBという構造体にコピーする関数を作成しない
といけなくなりました。
AとCの構造体に定義してある変数名は一緒です。(Aの方が若干変数が多いです)
関数を増やさずに、改修する方法はありますか?
開発環境 WinXP Microsoft Visual C++ .NET
struct A {
};
struct B {
operator=(const A) ;
} ;
struct C :public A {
operator=(const B) ;
};
よくわからんが
こう言うことかな??
構造体の内容も、コピーする関数の呼び方も、中身もわからないので
なんともいえない。
CなのかC++なのかも判らない。
当たり障りの無い範囲でサンプル的なものを提示した方が早いかと。
あと、.NETと書いてしまうとマネージドなのかアンマネージドなのかとか
ヴァージョンはとか色々情報が欠落していると思います。
<構造体>
typedef struct tag_aaa {
char sMei[2];
int iCnt;
char sNaiyo[2];
} aaa;
typedef struct tag_bbb {
char sMei[2];
int iCnt;
} bbb;
typedef struct tag_ccc {
char sMei[2];
int iCnt;
} ccc;
<関数>
void CDoc::CopyBFromA(bbb* agpstbbb, aaa* agpstaaa)
{
agpstbbb->iCnt = agpstaaa->iCnt;
}
void CDoc::CopyBFromC(bbb* agpstbbb, ccc* agpstccc)
{
agpstbbb->iCnt = agpstccc->iCnt;
}
をひとつに纏めたいです。
上記の例ならこんな感じか。
aaa A;
bbb B;
ccc C;
memcpy( &B, &A, sizeof( bbb ) );
memcpy( &B, &C, sizeof( bbb ) );
ただし、型とサイズが上方一致する場合に限られる、かつメンバ関数が存在しない場合
に限られるが。
構造体(A,B,C)のコピー対象変数の名称は、一緒ですが、サイズがなります。
コピー対象外変数は、A,B,Cでばらばらです。
型とサイズが上方一致することもないです。
template <typename T, typename U>
void copy_obj ( T & dest, U & src )
{
dest.iCnt = src.iCnt;
}
なんてのを作れば,例示された物については片付きますが……。
> コピー対象外変数は、A,B,Cでばらばらです。
> 型とサイズが上方一致することもないです。
class Base {
// コピー対象変数
};
class AAA : public Base {
// コピー対象外変数
};
BBB, CCC も同様にしておいて、
void CDoc::CopySrcFromDst(base* dst, const base* src)
{
// コピー対象関数のコピー
dst->iCnt = src->iCnt;
...
}
と、いうのはいかが?
...いや、
> 構造体(A,B,C)のコピー対象変数の名称は、一緒ですが、サイズがなります。
コピー対象変数についてもサイズが異なる?intとshortみたいに?
そこの所を詳しくお願い。
# 2つの関数をまとめたいとか言うならば、いい機会なので
# 構造体を整理するとかできれば良いのだけど。
関数を一つにしたいだけなら
typedef struct tag_bbb {
char sMei[2];
int iCnt;
operator=(const A) ;
} bbb;
関数を一つにしたいだけなら
typedef struct tag_bbb {
char sMei[2];
int iCnt;
operator=(const A) ;
} bbb;
間違って送信してしまいました。
これが簡単だとおもいます。
typedef struct tag_bbb {
char sMei[2];
int iCnt;
operator=(const aaa src)
{
iCnt = src.iCnt;
}
operator=(const ccc src)
{
iCnt = src.iCnt;
}
} bbb;
aaa a;
bbb b;
ccc c;
b=a;
b=c;
一つの関数で両方に対応したいなら今の構造じゃ無理なんでは?
aaaとcccを共通で渡す方法が無いわけですし。
void*で受けたとしてもどちらの構造体が引き渡されたのかがわからなければ、
キャストができないのでメンバー名で代入できませんから。
引数一つ増やしてどっちを引き渡したのかを明示すれば可能でしょうけれど、
それだとあんまり意味が無いですよね。
共通の親クラスを作成してaaaとcccをそこから派生させて
インターフェイスは親クラスで取るようにすれば、似たような事はできそうですね。
たいちうさんの例はbbbも同じ派生にしてますからもっと汎用性が高いです。
今のままの構造体ですっきり何とかするのは無理じゃないかなと思います。