複数の構造体を1つの構造体にまとめるには・・・ – プログラミング – Home

複数の構造体を1つの構造体にまとめるに...
 
通知
すべてクリア

複数の構造体を1つの構造体にまとめるには・・・


ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

Aという構造体のデータをBという構造体にコピーする関数がありました。
追加改修で、Cという構造体のデータをBという構造体にコピーする関数を作成しない
といけなくなりました。
AとCの構造体に定義してある変数名は一緒です。(Aの方が若干変数が多いです)
関数を増やさずに、改修する方法はありますか?

開発環境 WinXP Microsoft Visual C++ .NET


引用解決済
トピックタグ
+
 +
(@ )
ゲスト
結合: 17年前
投稿: 50
 

struct A {
};

struct B {
operator=(const A) ;
} ;

struct C :public A {
operator=(const B) ;
};

よくわからんが
こう言うことかな??


返信引用
rin
 rin
(@rin)
ゲスト
結合: 18年前
投稿: 112
 

構造体の内容も、コピーする関数の呼び方も、中身もわからないので
なんともいえない。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

CなのかC++なのかも判らない。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

当たり障りの無い範囲でサンプル的なものを提示した方が早いかと。
あと、.NETと書いてしまうとマネージドなのかアンマネージドなのかとか
ヴァージョンはとか色々情報が欠落していると思います。


返信引用
ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

<構造体>
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;
}
をひとつに纏めたいです。


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

上記の例ならこんな感じか。
aaa A;
bbb B;
ccc C;
memcpy( &B, &A, sizeof( bbb ) );
memcpy( &B, &C, sizeof( bbb ) );
ただし、型とサイズが上方一致する場合に限られる、かつメンバ関数が存在しない場合
に限られるが。


返信引用
ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

構造体(A,B,C)のコピー対象変数の名称は、一緒ですが、サイズがなります。
コピー対象外変数は、A,B,Cでばらばらです。
型とサイズが上方一致することもないです。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

template <typename T, typename U>
void copy_obj ( T & dest, U & src )
{
dest.iCnt = src.iCnt;
}
なんてのを作れば,例示された物については片付きますが……。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> コピー対象外変数は、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つの関数をまとめたいとか言うならば、いい機会なので
# 構造体を整理するとかできれば良いのだけど。


返信引用
ngs
 ngs
(@ngs)
ゲスト
結合: 17年前
投稿: 5
 

関数を一つにしたいだけなら

typedef struct tag_bbb {
char sMei[2];
int iCnt;

operator=(const A) ;

} bbb;


返信引用
ngs
 ngs
(@ngs)
ゲスト
結合: 17年前
投稿: 5
 

関数を一つにしたいだけなら

typedef struct tag_bbb {
char sMei[2];
int iCnt;

operator=(const A) ;

} bbb;


返信引用
ngs
 ngs
(@ngs)
ゲスト
結合: 17年前
投稿: 5
 

間違って送信してしまいました。

これが簡単だとおもいます。

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;


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

一つの関数で両方に対応したいなら今の構造じゃ無理なんでは?
aaaとcccを共通で渡す方法が無いわけですし。
void*で受けたとしてもどちらの構造体が引き渡されたのかがわからなければ、
キャストができないのでメンバー名で代入できませんから。
引数一つ増やしてどっちを引き渡したのかを明示すれば可能でしょうけれど、
それだとあんまり意味が無いですよね。

共通の親クラスを作成してaaaとcccをそこから派生させて
インターフェイスは親クラスで取るようにすれば、似たような事はできそうですね。
たいちうさんの例はbbbも同じ派生にしてますからもっと汎用性が高いです。

今のままの構造体ですっきり何とかするのは無理じゃないかなと思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました