
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2重定義って??
-
visualstudio C# テキストボッ...
-
DWORDの実際の型は何でしょうか
-
構造体の要素すべてに対する四...
-
C++デバックエラーについて詳し...
-
C++ Builderでのpublic変数の扱...
-
C++でboolにintの値を代入する...
-
変数の型を定義しなかった場合...
-
コンパイルすると error C1083 ...
-
intとINTの違いは?
-
atoi() 実行エラー
-
ハンドルされていない例外が発...
-
【#define】 defineで定義した...
-
GCCで暗黙の型変換の警告を出し...
-
C言語で分割ファイル先の関数を...
-
関数名 (type *)
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
c languageで 簡単な質問があ...
-
エクセルで可視セルにのみ値貼...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
main.c:7:43: warning: implici...
-
long型の定数の末尾にLを付ける...
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
2重定義って??
-
C++のfor文について
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
intとINTの違いは?
-
C++でboolにintの値を代入する...
-
構造体の要素すべてに対する四...
-
プログラムの中で別のmainを呼...
-
エラー「invalid conversion fr...
-
GCCで暗黙の型変換の警告を出し...
-
【#define】 defineで定義した...
-
sshdログの意味
-
DDVによるメッセージの変更
-
typedef enumの使い方を教えて...
-
構造体を生成時にわざわざ初期...
-
DLLでLIBファイルが作成されない
おすすめ情報
<補足>
誤: 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()関数で正しい値が渡されてない原因なのでしょうか。
教えてくださいおねがいします。