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

[戻る]
ひっき 2002/10/04(金) 10:24:58
初歩の初歩の質問だと思われますが、
どうかご協力ください。。

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

ぷふ 2002/10/04(金) 11:21:48
void CView::OnDraw(CDC* pDC)
{
    name = "goast";
    CCard card;
    card.GetData(name);
    pDC -> TextOut(10,10,Power);
}

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

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

ぷふ 2002/10/04(金) 13:10:55
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 2002/10/04(金) 16:06:23
>Powerの定義は
>CCard.h に public で int Power と定義してあります。

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


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

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

暇人 2002/10/04(金) 19:23:30
MSDNで printf と strcpy を調べてみてください。
ただし実際にこれらを使えということではありません。

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

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

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

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

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

アイススケーター 2002/10/06(日) 05:03:25
どうやら超初心者の方らしいので説明します。

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

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

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

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

YuO [E-Mail] 2002/10/06(日) 11:29:09
> ↑は引数の型をわかっていないということですよ。
> 「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));
としてです。

アイススケーター 2002/10/07(月) 08:19:17
YuOさんへ
 うっかりしていました。
 結局、CString(1, 1)を表示しているということでアスキーコードの
0x01を表示していたのですね。

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

古いスレッドには追加発言できません。