アプリ版:「スタンプのみでお礼する」機能のリリースについて

クラスAを作り、パブリックなメンバ変数valueを定義する。

クラスAのメンバ関数setvalueの引数をvalueに代入する。

クラスAを継承したクラスBを作り、そのメンバ関数内でvalueの中身を表示する。

これを正しく実現するにはどこに注意すればよいのでしょうか。自分で作ってみると、コンパイルエラーにはならないんですが、valueの中身が覚えのない巨大な数値で表示されてしまいます。

A 回答 (4件)

クラスとインスタンスをごちゃまぜにしていませんか?



Aのクラスの実体とBのクラスの実体は別々であるにもかかわらず、
Aで設定したものがBにも設定されることを期待しているように見えます。

参考URL:http://e-words.jp/w/E382A4E383B3E382B9E382BFE383 …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。あれからいろいろ勉強して、なんとなく意味が分かってきました。まだ解決していませんが、新たな疑問が出そうなので、改めて質問させていただきます。

お礼日時:2009/01/16 12:27

クラスAのインスタンス作ってsetvalueして、それと別にクラスBのインスタンス作って表示してる


って線が濃厚そうですが
確かにこんなコードでも警告もエラーも出ませんが

#include <stdio.h>
class A {
public:
int value;
void setvalue (int a) {value = a;}
};
class B : public A {
public:
void print (void) {printf ("%d\n", value);}
};
int main (void)
{
A a;
a.setvalue (100);
B b;
b.print ();
}

この回答への補足

まさしくこれが原因のようです。みなさま丁寧な回答ありがとうございます。人と壁との衝突判定をするつもりでした。自分が書いたコードでは人が壁の位置を知ろうとしたのが間違いの原因でした。

次に、「物理」という名の、「人と壁を継承したクラス」を作ってみました。そのクラスは壁や人の位置などを知る権利があるはずなのですが、これでも「空っぽの変数を表示したときの巨大な数値」になってしまいます。衝突判定をフレンド関数に指定したり、物理クラスをフレンドにしたりと、いろいろ試しましたが目標に到達できません。
検索キーワードでもよいので、アドバイスがあればよろしくお願いします。

補足日時:2009/01/10 17:12
    • good
    • 0

 こんにちは。



 イニシャライザでメンバ変数の初期化をし忘れているのではないでしょうか。

struct A
{
//イニシャライザで初期化する
//A() : m_value(0)←此れがイニシャライザ{}

//此方の方が良いかもしれない
explicit A(int value = 0) : m_value(value){}

//此れが仮想関数。クラスBで更に上書きする
virtual void setvalue(int value){ m_value = value; }

//此れがあればpublicを回避出来る
int getvalue() const { return m_value; }

private:
int m_value;//此れがメンバ変数
};
    • good
    • 0
この回答へのお礼

どうやら実体の概念が未熟だったようです。
まだ疑問が残るので、改めて質問させていただきます。
ありがとうございました。

お礼日時:2009/01/16 12:30

メンバをpublicにするのはお勧めしませんが、特におかしいところはありません。

 記述している以外の部分でロジックミスとかは無いでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
表示する場所と方法がまちがっているような気がしてきました。
新たな疑問が出てきたので、改めて質問しようと思います。

お礼日時:2009/01/16 12:29

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