C++でクラス設計のコードを書いています。
隠蔽性を大事にするため、(特に必要がない他は)最初からメンバ変数は全てprotected(private)のメンバとして宣言し、getter/setter関数で操作しています。
クラスABCのメンバ関数の引数として、クラスXYZのメンバ関数を呼び出すとき、問題が発生します。
クラスABCのメンバ関数の引数に呼び出した、クラスXYZのget関数によって正しい値が渡されず、引数に意味のない数字が渡されてしまいます。
一方同じ設計で、クラスXYZのメンバ変数をpublicで宣言し(getter関数を使わず変数本体だけ)直接渡すと、意図した決められた値が渡されます。
よって関数の引数に他のクラスの関数を呼び出すときに限りエラーが起きていると思われます。
コードは以下の通りです。
<ABC.h>
class ABC{
public:
void A(int);
};
<ABC.cpp>
#include"ABC.h"
void ABC::A(int i){ printf("%d", i); }
<XYZ.h>
class XYZ{
protected:
static int X;
public:
static int getX(){return X;}
};
<XYZ.cpp>
#include"XYZ.h"
int XYZ::X;
<MAIN.cpp>
#include"ABC.h"
#include"XYZ.h"
int main(void){
ABC abc;
XYZ xyz;
abc.A(xyz.getX); //この行のgetX関数で正しい値が渡されてない(public変数はok)
return 0;
}
クラス設計の隠蔽性を大事に(メンバ変数をprotectedに)したまま、クラスABCのメンバ関数の引数に、クラスXYZのメンバ関数によって正しい値が渡される方法を教えてください。
No.3
- 回答日時:
>abc.A(xyz.getX);
こう書いたときに
>「C2664 'なんちゃら': 引数 1 を 'int (__cdecl *)(void)' から 'int' へ変換できません。」
このエラーが出て(int型の引数に対して'int (__cdecl *)(void)型の関数ポインタを渡しているのだから当たり前)
>abc.A((int)xyz.getX);
こう書いたら
>引数に意味のない数字が渡されてしまいます
こうなったのでしょうか。(関数ポインタをintにキャストして渡しているのだから当たり前)
それで、xyz.getX()に直したことで解決したのではないですか。
honorさん
ご回答ありがとうございます。
単純明快に(int)を外し、getXに()を付けたことで解決できました。
胸のモヤモヤが解消できました、ありがとうございました。
No.2
- 回答日時:
その
「C2664 'なんちゃら': 引数 1 を 'int (__cdecl *)(void)' から 'int' へ変換できません。」
というエラーが出たときにはどのように書いていたんでしょうか? 本当のプログラム全体を見せてもらえませんか?
コード全体に関しては、長い目で将来本格的に売り物にする可能性があるので、誰かが公開して利用しなように、見て不必要な部分は極力削ぎ、本質の理解に大事な部分だけを使って書いています。
以上の理由の為コードは出せませんごめんなさい。
というか捕捉欄だけだと狭すぎます。
'なんちゃら'の中身は家に帰ってから見たいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
typedef enumの使い方を教えて...
-
構造体の要素すべてに対する四...
-
変数の型を定義しなかった場合...
-
intとINTの違いは?
-
VC6でlong longでエラー?
-
DDVによるメッセージの変更
-
gccのエラー "initialization d...
-
void func( void )について
-
ハンドルされていない例外が発...
-
C言語での方向キー入力判定
-
main()とint main(void)の違い
-
直接アドレス指定のポインタの...
-
64bit → 32bit型へのキャスト
-
enumについて
-
HINSTANCEの型
-
クラス間の変数について
-
C++,ヘッダファイルのエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
typedef enumの使い方を教えて...
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
関数の実体定義にヘッダファイ...
-
構造体の要素すべてに対する四...
-
ハンドルされていない例外が発...
-
C++でboolにintの値を代入する...
-
変数の型を定義しなかった場合...
-
intとINTの違いは?
-
main.c:7:43: warning: implici...
-
void func( void )について
-
C言語 宣言した変数になにも代...
-
【#define】 defineで定義した...
-
構造体の宣言でエラーが出ます。
-
C言語での方向キー入力判定
-
プログラムの中で別のmainを呼...
-
C言語について質問です。 子プ...
おすすめ情報
<補足>
誤: xyz.getX
正: xyz.getX()
もう一つ重要な点を説明するのを忘れていました。
クラスABCのメンバ関数の引数として、クラスXYZのメンバ関数を呼び出すとき、「C2664 'なんちゃら': 引数 1 を 'int (__cdecl *)(void)' から 'int' へ変換できません。」というエラーが出てしまっていました。
そこで暫定的にエラーを回避し、呼び出した関数の型を同じ型にするために型キャスト「(int)」を使い、MAIN.cppの6行目は下の通りのコードを書いていました。
abc.A((int)xyz.getX());
そもそもなぜint型で宣言した関数の戻り値の型がvoid(voidポインタ?)になっているのか不明です。この型キャストがgetX()関数で正しい値が渡されてない原因なのでしょうか。
教えてくださいおねがいします。