みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

外部からメンバ変数の中身を取得するには

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

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

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

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

投稿日時 - 2009-01-10 03:08:25

QNo.4618108

すぐに回答ほしいです

質問者が選んだベストアンサー

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

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

参考URL:http://e-words.jp/w/E382A4E383B3E382B9E382BFE383B3E382B9.html

投稿日時 - 2009-01-11 14:25:34

お礼

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

投稿日時 - 2009-01-16 12:27:36

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

クラス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 13:34:49

補足

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

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

投稿日時 - 2009-01-10 17:12:10

ANo.2

 こんにちは。

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

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;//此れがメンバ変数
};

投稿日時 - 2009-01-10 11:26:41

お礼

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

投稿日時 - 2009-01-16 12:30:42

ANo.1

メンバをpublicにするのはお勧めしませんが、特におかしいところはありません。 記述している以外の部分でロジックミスとかは無いでしょうか?

投稿日時 - 2009-01-10 10:37:15

お礼

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

投稿日時 - 2009-01-16 12:29:27