- ベストアンサー
外部からメンバ変数の中身を取得するには
クラスAを作り、パブリックなメンバ変数valueを定義する。 ↓ クラスAのメンバ関数setvalueの引数をvalueに代入する。 ↓ クラスAを継承したクラスBを作り、そのメンバ関数内でvalueの中身を表示する。 これを正しく実現するにはどこに注意すればよいのでしょうか。自分で作ってみると、コンパイルエラーにはならないんですが、valueの中身が覚えのない巨大な数値で表示されてしまいます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
クラスとインスタンスをごちゃまぜにしていませんか? Aのクラスの実体とBのクラスの実体は別々であるにもかかわらず、 Aで設定したものがBにも設定されることを期待しているように見えます。
その他の回答 (3)
クラス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 (); }
補足
まさしくこれが原因のようです。みなさま丁寧な回答ありがとうございます。人と壁との衝突判定をするつもりでした。自分が書いたコードでは人が壁の位置を知ろうとしたのが間違いの原因でした。 次に、「物理」という名の、「人と壁を継承したクラス」を作ってみました。そのクラスは壁や人の位置などを知る権利があるはずなのですが、これでも「空っぽの変数を表示したときの巨大な数値」になってしまいます。衝突判定をフレンド関数に指定したり、物理クラスをフレンドにしたりと、いろいろ試しましたが目標に到達できません。 検索キーワードでもよいので、アドバイスがあればよろしくお願いします。
- machongola
- ベストアンサー率60% (434/720)
こんにちは。 イニシャライザでメンバ変数の初期化をし忘れているのではないでしょうか。 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;//此れがメンバ変数 };
お礼
どうやら実体の概念が未熟だったようです。 まだ疑問が残るので、改めて質問させていただきます。 ありがとうございました。
- alesi_sato
- ベストアンサー率35% (23/65)
メンバをpublicにするのはお勧めしませんが、特におかしいところはありません。 記述している以外の部分でロジックミスとかは無いでしょうか?
お礼
回答ありがとうございます。 表示する場所と方法がまちがっているような気がしてきました。 新たな疑問が出てきたので、改めて質問しようと思います。
お礼
回答ありがとうございます。あれからいろいろ勉強して、なんとなく意味が分かってきました。まだ解決していませんが、新たな疑問が出そうなので、改めて質問させていただきます。