別のクラスの関数を呼びたい – プログラミング – Home

別のクラスの関数を呼びたい
 
通知
すべてクリア

別のクラスの関数を呼びたい


ひっき
 ひっき
(@ひっき)
ゲスト
結合: 23年前
投稿: 3
Topic starter  

初歩の初歩の質問だと思われますが、
どうかご協力ください。。

現在あるクラスで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);
}


引用解決済
トピックタグ
ぷふ
 ぷふ
(@ぷふ)
ゲスト
結合: 23年前
投稿: 4
 

void CView::OnDraw(CDC* pDC)
{
name = goast;
CCard card;
card.GetData(name);
pDC -> TextOut(10,10,Power);
}

でうまくいきませんか??間違っていたらごめんなさい。


返信引用
ひっき
 ひっき
(@ひっき)
ゲスト
結合: 23年前
投稿: 3
Topic starter  

ご回答ありがとうございます。
他のクラスの関数の呼び出し方が間違っていた、ということで
よろしいのでしょうか?
試してみましたところ、先ほどまでのエラーは解消されましたが、
今度は「'Power' : 定義されていない識別子です。」という
エラーがでてしまいました。Powerの定義は
CCard.h に public で int Power と定義してあります。
CView.cpp ファイルの先頭でCCard.hをincludeしてあるので
CView.cpp でも Powerを扱えると思っていたのですが
間違っているのでしょうか?


返信引用
ぷふ
 ぷふ
(@ぷふ)
ゲスト
結合: 23年前
投稿: 4
 

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);
}

こんな感じかな。。。


返信引用
EIJI
 EIJI
(@EIJI)
ゲスト
結合: 24年前
投稿: 76
 

>Powerの定義は
>CCard.h に public で int Power と定義してあります。

こういう情報を最初から出してもらわないと。
CCardsWarCardsクラスってなんだ? とか
「ss == goast」なんて書き方でいいの? とか
リターンしないパスがあるって警告でないかな? とか
疑問が尽きません。
十分な情報がないと答えもあいまいになってしまいますよ。

余談
goastって英和辞典でヒットしませんね。
Googleだとたくさんヒットしますけど。


返信引用
ひっき
 ひっき
(@ひっき)
ゲスト
結合: 23年前
投稿: 3
Topic starter  

ぷふさん、ご回答ありがとうございます。
なんとか他のクラスのメンバ変数、メンバ関数を呼び出すことに成功しました。
しかし実際に動かしてみると、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」という表記に関しまして、私にはどこが問題となっているのか
まったくわからない状態であります。もしよろしければ、この表記の問題となる部分を
解説していただけないでしょうか?
質問ばかりで大変心苦しくはありますが、どうぞ宜しくお願い致します。


返信引用
暇人
 暇人
(@暇人)
ゲスト
結合: 23年前
投稿: 19
 

MSDNで printf と strcpy を調べてみてください。
ただし実際にこれらを使えということではありません。

#.cppのみの転載時にはなるべくコメントを加えましょう。
# return Power; // CCardのメンバ変数 int
# CCardsWarCards::GetData(name); // この行でエラー

#最初のソースではPowerはグローバル変数かと思いました。
# m_とかg_とかつける習慣をつけて欲しいかも。


返信引用
EIJI
 EIJI
(@EIJI)
ゲスト
結合: 24年前
投稿: 76
 

情報不足に関しては別に怒ってるわけではなくて、
結局は質問する人が損しますよってことです。
「使用上の注意」にも開発環境を記述せよとありますが、
これもやらないで不利益になるのは質問する側なんですけどね。

pDC->TextOut(10,10, 1 ); の代わりに
pDC->TextOut(10,10,1); としてみてください。
この違いをちゃんと理解していないと先に進むのは困難ですよ。

「ss == goast」は単にアドレスを比較しているだけです。
文字列の内容を比較するならこの書き方ではできません。
ポインタ、変数の型あたりの概念がはっきりしていないように
見受けられますので、その辺りを重点的に調べてみてください。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

どうやら超初心者の方らしいので説明します。

>pDC->TextOut(10,10, 1 ); の代わりに
>pDC->TextOut(10,10,1); としてみてください。

↑は引数の型をわかっていないということですよ。
「1」を表示させたい場合は、文字列のアドレスを引数として与えるのですが
1としてもこれをアドレスとして認識します。
つまりアドレス1にある文字列を1バイト表示してしまいます。

> if (ss == goast)
↑はssのポインタとgoastの格納されたアドレスを比較しています。
文字列の比較はstrcmp等の戻り値で判断するようにしましょう。

これらの内容は、C言語初心者用の書籍に確実に書いてあるとおもいますので
一度、本屋さんへいかれてはどうですか。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

> ↑は引数の型をわかっていないということですよ。
> 「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));
としてです。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

YuOさんへ
 うっかりしていました。
 結局、CString(1, 1)を表示しているということでアスキーコードの
0x01を表示していたのですね。

 私も注意します。失礼しました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました