dポイントプレゼントキャンペーン実施中!

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のメンバ関数によって正しい値が渡される方法を教えてください。

質問者からの補足コメント

  • どう思う?

    <補足>
    誤: 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()関数で正しい値が渡されてない原因なのでしょうか。
    教えてくださいおねがいします。

      補足日時:2016/03/15 14:25

A 回答 (3件)

誤: xyz.getX


正: xyz.getX()

または

C++/CLI の property 構文を使う
    • good
    • 1
この回答へのお礼

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

propety 構文も試してみたいと思います。
しかしこの設計のままいける方法があるか探してみます。

お礼日時:2016/03/15 13:51

>abc.A(xyz.getX);


こう書いたときに
>「C2664 'なんちゃら': 引数 1 を 'int (__cdecl *)(void)' から 'int' へ変換できません。」
このエラーが出て(int型の引数に対して'int (__cdecl *)(void)型の関数ポインタを渡しているのだから当たり前)
>abc.A((int)xyz.getX);
こう書いたら
>引数に意味のない数字が渡されてしまいます
こうなったのでしょうか。(関数ポインタをintにキャストして渡しているのだから当たり前)

それで、xyz.getX()に直したことで解決したのではないですか。
    • good
    • 1
この回答へのお礼

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

単純明快に(int)を外し、getXに()を付けたことで解決できました。
胸のモヤモヤが解消できました、ありがとうございました。

お礼日時:2016/03/15 21:47

その


「C2664 'なんちゃら': 引数 1 を 'int (__cdecl *)(void)' から 'int' へ変換できません。」
というエラーが出たときにはどのように書いていたんでしょうか? 本当のプログラム全体を見せてもらえませんか?
    • good
    • 1
この回答へのお礼

コード全体に関しては、長い目で将来本格的に売り物にする可能性があるので、誰かが公開して利用しなように、見て不必要な部分は極力削ぎ、本質の理解に大事な部分だけを使って書いています。
以上の理由の為コードは出せませんごめんなさい。

というか捕捉欄だけだと狭すぎます。
'なんちゃら'の中身は家に帰ってから見たいと思います。

お礼日時:2016/03/15 21:29

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