現在、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.色々と試してみましたが、現在の私の知識ではコンパイルができません。
アドバイスのほど、よろしくお願いします。
No.1ベストアンサー
- 回答日時:
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で記述しましょう
この回答への補足
回答ありがとうございます。
同じ構造体を二度定義するよりも、共通で一度定義する方が論理的ですよね。
早速、プログラムを書き直してみます。
結果につきましては、後日報告させて頂きます。
アドバイス通り、構造体をグローバルに定義することにより、コンパイルが正しく行われ、構造体及び、動的構造体についても、問題を解決する事が出来ました。
今後、不明な点がありましたら質問させて頂きたいと思いますので、その時はアドバイス宜しくお願い致します。
ありがとうございました。
No.2
- 回答日時:
おそらくエラーが出ている部分はここ
>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 );の誤りです。
質問事項を、記載する時に誤ってしまいました。
失礼いたしました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
C言語の<ctype.h>のisspace()に...
-
構造体の要素すべてに対する四...
-
C++のfor文について
-
[C++]メンバ関数の仮引数について
-
visualstudio C# テキストボッ...
-
C++の(左辺値)参照を参照渡し
-
C++でboolにintの値を代入する...
-
typedef enumの使い方を教えて...
-
関数の実体定義にヘッダファイ...
-
main.c:7:43: warning: implici...
-
intとINTの違いは?
-
コンパイルすると error C1083 ...
-
ハンドルされていない例外が発...
-
値を返り値に返すのと参照渡し...
-
識別子が定義されていませんと...
-
2重定義って??
-
void func( void )について
-
【#define】 defineで定義した...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
2重定義って??
-
long型の定数の末尾にLを付ける...
-
C++のfor文について
-
typedef enumの使い方を教えて...
-
関数の実体定義にヘッダファイ...
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
C++でboolにintの値を代入する...
-
main.c:7:43: warning: implici...
-
プログラムの中で別のmainを呼...
-
【#define】 defineで定義した...
-
void func( void )について
-
構造体の要素すべてに対する四...
-
C++の(左辺値)参照を参照渡し
-
構造体の宣言でエラーが出ます。
-
main()とint main(void)の違い
-
intとINTの違いは?
-
エラー「invalid conversion fr...
おすすめ情報