プロが教えるわが家の防犯対策術!

現在、C++の構造体を理解しようと努めていますが、どうしても理解できない点があり、
なにとぞ、ご指導・ご助言のほどよろしくお願い致します。

1.質問内容
 a.構造体を引数とする、クラス間のデータの受渡し方法について
・主プロ(主クラス)側の構造体のメンバ変数を、サブプロ(サブクラス)側で更新するのに、
メンバ変数を一つずつ引数として渡せば、正しく更新できるのですが、構造体を引数として渡すと
   コンパイルエラーになります。
  ・どのように定義すれ場良いのかをご助言お願い致します。
2.プログラムの内容を簡単に記載します。
 全部を記載する事は出来ないので、一部を省略して簡単に必要な所だけを記載します。
 a.Main.cpp
int main()
{
CMain main;
CSub sub;

//Main_Classの関数に、Sub_Classクラスのポインタを引数として渡し、Sub_Classクラスの関数を呼び出す
main.Main_FuncCall(&sub);

return 0;
}

b.CMain_Class.h
class CMain
{
public:
//コンストラクタ
省略
//デストラクタ
省略

typedef struct CHAR1
{
int m_chx;
int m_chy;
bool m_chValidFlag;
};
CHAR1 *pc;

//データの受け渡し(ポインタ)
void Main_FuncCall( CSub* cs );
};

 c.CMain_Class.cpp
void CMain::Main_FuncCall( CSub* cs )
{
//メインクラスの構造体を引数として、サブクラスの関数を呼び出す
//サブプロ側の構造体を更新する
cs->Sub_FuncCall4( pc );
}

d.CSub_Class.h
class CSub
{
public:
//コンストラクタ
省略
//デストラクタ
省略

typedef struct CHAR_S
{
int m_chx;
int m_chy;
bool m_chValidFlag;
};
CHAR_S *ps;

void Sub_FuncCall( CHAR_S *pc );
};

e.CSub_Class.cpp
void CSub::Sub_FuncCall( CHAR_S *pc )
{
pc[1].m_chx += ps[1].m_chx;
}

3.コンパイルする
 a. cs->Sub_FuncCall4( pc ); -> 1 番目の引数を 'struct CMain::CHAR1 *' から 'struct CSub::CHAR_S *'
に変換できません。 (新しい機能 ; ヘルプを参照) 指示された型は関連がありません; 変換には
reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。
b.色々と試してみましたが、現在の私の知識ではコンパイルができません。
  アドバイスのほど、よろしくお願いします。

A 回答 (2件)

CMain,CSub共通の構造体宣言が必要なら 構造体をグローバルに定義する方法が一般的かと思います



CMain,CSubで共通のヘッダーを用意してそこに構造体を定義しましょう

--- Common.H
typedef struct CommonCHAR {
  int m_chx;
  int m_chy;
  bool m_chValidFlag;
}COMMONCHAR, *LPCOMMONCHAR;
としておいて CMain_Class.HやCSub_Class.Hから構造体の定義をはずします
各ヘッダの冒頭で
#include "Common.h"
を記述します

CMain,CSubの変数宣言または仮引数宣言を
CommonCHARで記述しましょう

この回答への補足

回答ありがとうございます。

 同じ構造体を二度定義するよりも、共通で一度定義する方が論理的ですよね。
早速、プログラムを書き直してみます。
結果につきましては、後日報告させて頂きます。

補足日時:2009/01/30 16:49
    • good
    • 0
この回答へのお礼

 アドバイス通り、構造体をグローバルに定義することにより、コンパイルが正しく行われ、構造体及び、動的構造体についても、問題を解決する事が出来ました。

 今後、不明な点がありましたら質問させて頂きたいと思いますので、その時はアドバイス宜しくお願い致します。
ありがとうございました。

お礼日時:2009/02/01 11:35

おそらくエラーが出ている部分はここ


>cs->Sub_FuncCall4( pc );

肝心の「Sub_FuncCall4」についての宣言がないけど、
「CSub::Sub_FuncCall( CHAR_S *pc )」と同様であれば、
「CSubのCHAR_S型」に対して、「CMainのCHAR1型」を渡そうとしていのだから、
質問に書かれている「型が一致しない」エラーが出て当然。

この回答への補足

回答ありがとうございます。

>cs->Sub_FuncCall4( pc );

このSub_FuncCall4( pc );は、Sub_FuncCall( pc );の誤りです。
質問事項を、記載する時に誤ってしまいました。
失礼いたしました。

補足日時:2009/01/30 16:51
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!