初歩の初歩の質問だと思われますが、
どうかご協力ください。。
現在あるクラスでpublicで定義したメンバ関数を
他のクラス内で呼び出したいと考えています。
いろいろと考えてビルドしてみたのですが、
「error C2352: 静的でないメンバ関数の中で呼び出しが正しくありません。」
「'GetData' の宣言を確認してください。」
というエラーがでてしまいます。
呼び出しの方法が間違っているのか、それとも呼び出すことはできないのか、、、
はたまたプログラムが間違っているのか見当もつかない状況です。
どなたか御教授お願い致します。。
[CCardクラス]
int CCard::GetData(char* ss)
{
if (ss == goast)
{
CCard goast;
goast.SetPower(1);
return Power;
}
}
[viewクラス]
void CView::OnDraw(CDC* pDC)
{
name = goast;
CCardsWarCards::GetData(name);
pDC -> TextOut(10,10,Power);
}
void CView::OnDraw(CDC* pDC)
{
name = goast;
CCard card;
card.GetData(name);
pDC -> TextOut(10,10,Power);
}
でうまくいきませんか??間違っていたらごめんなさい。
ご回答ありがとうございます。
他のクラスの関数の呼び出し方が間違っていた、ということで
よろしいのでしょうか?
試してみましたところ、先ほどまでのエラーは解消されましたが、
今度は「'Power' : 定義されていない識別子です。」という
エラーがでてしまいました。Powerの定義は
CCard.h に public で int Power と定義してあります。
CView.cpp ファイルの先頭でCCard.hをincludeしてあるので
CView.cpp でも Powerを扱えると思っていたのですが
間違っているのでしょうか?
CViewでCCardクラスのPowerを扱うってことですか?
そうだったら、
card.PowerでCCardクラスのPowerというメンバ変数を参照することができます。
void CView::OnDraw(CDC* pDC)
{
name = goast;
CCard card;
card.GetData(name);
pDC -> TextOut(10,10,card.Power);
}
こんな感じかな。。。
>Powerの定義は
>CCard.h に public で int Power と定義してあります。
こういう情報を最初から出してもらわないと。
CCardsWarCardsクラスってなんだ? とか
「ss == goast」なんて書き方でいいの? とか
リターンしないパスがあるって警告でないかな? とか
疑問が尽きません。
十分な情報がないと答えもあいまいになってしまいますよ。
余談
goastって英和辞典でヒットしませんね。
Googleだとたくさんヒットしますけど。
ぷふさん、ご回答ありがとうございます。
なんとか他のクラスのメンバ変数、メンバ関数を呼び出すことに成功しました。
しかし実際に動かしてみると、Power = 1;と定義したはずなのに、
画面に表示させると「フ」という文字がでてしまいます。
Powerの値を変えても「フ」という文字がでてしまい、
「pDC -> TextOut(10,10,1)」としてみると
半角で「■」という記号が出力されてしまいます。
「int x;
x = 100;
pDC -> TextOut(10,10,x);」としてみると今度は「d」と表示されてしまいます。
xの値を80にすると「P」が表示されました。
ASCIIコードが表示されてしまっているのでしょうか?
だとするとどのようにすれば解決できるのでしょうか?
EIJIさん、ご指摘ありがとうございます。
不十分な情報しか掲示せずに質問してしまい、申し訳ありませんでした。
CCardsWarCardsクラスというのは現在作成中のプロジェクトの名前で、
こちらに投稿するにあたり、簡単な名前に変えようと思い、CCardクラスに
変更して投稿したのですが、その部分だけ変更せずに投稿してしまいました。
リターンしないパスがある、という警告は、実際のプログラムでは出ないのですが
投稿する際に、質問に関係のなさそうな部分を削除して投稿したため、
このようなプログラムとなりました。大変わかりにくく、かつ情報の不足した
プログラムを載せてしまい、申し訳ありませんでした。
「ss == goast」という表記に関しまして、私にはどこが問題となっているのか
まったくわからない状態であります。もしよろしければ、この表記の問題となる部分を
解説していただけないでしょうか?
質問ばかりで大変心苦しくはありますが、どうぞ宜しくお願い致します。
MSDNで printf と strcpy を調べてみてください。
ただし実際にこれらを使えということではありません。
#.cppのみの転載時にはなるべくコメントを加えましょう。
# return Power; // CCardのメンバ変数 int
# CCardsWarCards::GetData(name); // この行でエラー
#最初のソースではPowerはグローバル変数かと思いました。
# m_とかg_とかつける習慣をつけて欲しいかも。
情報不足に関しては別に怒ってるわけではなくて、
結局は質問する人が損しますよってことです。
「使用上の注意」にも開発環境を記述せよとありますが、
これもやらないで不利益になるのは質問する側なんですけどね。
pDC->TextOut(10,10, 1 ); の代わりに
pDC->TextOut(10,10,1); としてみてください。
この違いをちゃんと理解していないと先に進むのは困難ですよ。
「ss == goast」は単にアドレスを比較しているだけです。
文字列の内容を比較するならこの書き方ではできません。
ポインタ、変数の型あたりの概念がはっきりしていないように
見受けられますので、その辺りを重点的に調べてみてください。
どうやら超初心者の方らしいので説明します。
>pDC->TextOut(10,10, 1 ); の代わりに
>pDC->TextOut(10,10,1); としてみてください。
↑は引数の型をわかっていないということですよ。
「1」を表示させたい場合は、文字列のアドレスを引数として与えるのですが
1としてもこれをアドレスとして認識します。
つまりアドレス1にある文字列を1バイト表示してしまいます。
> if (ss == goast)
↑はssのポインタとgoastの格納されたアドレスを比較しています。
文字列の比較はstrcmp等の戻り値で判断するようにしましょう。
これらの内容は、C言語初心者用の書籍に確実に書いてあるとおもいますので
一度、本屋さんへいかれてはどうですか。
> ↑は引数の型をわかっていないということですよ。
> 「1」を表示させたい場合は、文字列のアドレスを引数として与えるのですが
> 1としてもこれをアドレスとして認識します。
> つまりアドレス1にある文字列を1バイト表示してしまいます。
C++ですから,整数→ポインタ変換は0以外では暗黙に行われることはありません。
なぜ表示されるかというと,どちらも,
BOOL CDC::TextOut(int, int, const CString &);
が使われています。
#元々ポインタを利用するCDC::TextOutは使っていない。
pDC->TextOut(10, 10, 1);
は
pDC->TextOut(10, 10, CString(1));
として,
pDC->TextOut(10, 10, 1);
は
pDC->TextOut(10, 10, CString(1, 1));
としてです。
YuOさんへ
うっかりしていました。
結局、CString(1, 1)を表示しているということでアスキーコードの
0x01を表示していたのですね。
私も注意します。失礼しました。