• ベストアンサー

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

クラスAを作り、パブリックなメンバ変数valueを定義する。 ↓ クラスAのメンバ関数setvalueの引数をvalueに代入する。 ↓ クラスAを継承したクラスBを作り、そのメンバ関数内でvalueの中身を表示する。 これを正しく実現するにはどこに注意すればよいのでしょうか。自分で作ってみると、コンパイルエラーにはならないんですが、valueの中身が覚えのない巨大な数値で表示されてしまいます。

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

  • ベストアンサー
  • buihyaku
  • ベストアンサー率29% (97/326)
回答No.4

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

参考URL:
http://e-words.jp/w/E382A4E383B3E382B9E382BFE383B3E382B9.html
sanato
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

noname#208124
noname#208124
回答No.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 (); }

sanato
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
回答No.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;//此れがメンバ変数 };

sanato
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

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

sanato
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • クラスの継承でメンバ変数が・・

    初めてクラスの継承をしている者です。 親クラスA のメンバ変数らを 親クラスAからの処理で呼び出した 子クラスB で変更したいのですが、 子クラスB内ではちゃんと処理で数値が変化するのですが、 親クラスAに戻ると数値が全て初期値に戻ってしまいます。 継承方法は単に public 親クラスA と記述しているだけで、 親クラスAと子クラスBは別々のファイルに1クラスずつで記述しています。 コンパイルは警告もエラーも出ず動きます。 子クラスから親クラスのメンバ変数を変更するにはどうすれば良いのでしょうか?

  • 「引数の書き方」と「メンバ変数とメンバ関数の名前」について、教えてくだ

    「引数の書き方」と「メンバ変数とメンバ関数の名前」について、教えてください。 クラス内のコード抜粋なのですが、下記はどういう意味なのでしょうか? ▼メンバ変数 var $j = true; ▼メンバ関数 function j($p = false){ if($p) $this->j = false; return $this->j; } $this->j(true); 分からないこと ・コードの意味全般 ・($p = false)と書かれている引数の意味 ・メンバ変数とメンバ関数の名前は同じでもよいか? 

    • ベストアンサー
    • PHP
  • メンバー関数ポインタ

    非常に基礎的なことで申し訳ないですが。 クラスのメンバー関数へのポインタ変数へ 代入しようとすると 関数呼び出しには引数リストがありません。 とエラーがでます。 何がわるいでしょうか? 以下のような感じのコードです。 void (classname::*P_func)() = classname::func; 定義しただけと思いますが。。 VCです。 よろしくお願いします。

  • 【C++】メンバ変数をポインタで宣言するデメリット

    クラスAが、メンバーとして、 クラスXと、クラスYを持っているとします。 そのようなとき、 【ケース1】  クラスAを定義する際、  メンバである、クラスX、クラスYは、ポインタで宣言させる。 【ケース2】  クラスAを定義する際、  メンバである、クラスX、クラスYは、ポインタではなく、クラスX/クラスYの型として宣言させる。 があると思いますが、それぞれどのようなデメリットがあるでしょうか? ----------------------------- 私は、ケース1は、 メリット:   クラスXを継承したクラスChild_Xや、クラスYを継承したクラスChild_Yを、   クラスAで扱えるようになる。   デメリット:   クラスXのポインタで宣言していると、クラスXを派生したクラスが格納可能であるため、   開発時に、そのメンバーに、実際にはどの型のクラスが格納されているかがわからず、   Visual Studio で追いかけられない。   (※そのメンバーに対して、右クリック⇒定義で見ても、どの型のポインタ変数かはわかっても、     どの型がそこに突っ込まれているかは、代入されているところを探して確認しないとわからない。) 私は、処理を確認する際、『どの型の値がそこに突っ込まれているかは、代入されているところを探して確認しないとわからない。』というのが、可読性は悪いわ、確認に時間が取られるわで、 非常に大きなデメリットと考えています。 このデメリットを解消する方法はあるのでしょうか?

  • 文字列のメンバ変数を外部変数のように扱いたい

    済みません。質問なのですが、 メンバ変数を外部変数のように扱うにはどうしたらよいのでしょうか? int型などの場合、 class test{ static const int a; }; const int test::a = 10; とすればよいですよね? これをcharの配列にして class test{ static char a[7][32]; }; char test::a[0] = "test"; とすると サイズが0の配列を割り当てまたは宣言しようとしました というコンパイルエラーがでてしまいます…。 多次元配列の場合はstatic変数としてもてないのでしょうか? char** として宣言してもどこでnewを行えばよいか解りません。 コンストラクタの中で行えば そこでstaticではなくなってしまいますし…。 後、できればstringクラスの配列で持ちたいのですが #include <string> class test{ static string test[7]; }; string test::test[0] = "aaa"; なんてことができますでしょうか? 質問内容が解りにくいかも知れませんが どうか教えてください。 宜しくお願いいたします。

  • 【設計思想の質問】staticメソッド、メンバ変数

    【設計思想的な質問】 自分は、結合が弱いソースを好んでおり、 以下の例で言えば、後者のようにするのですが、 このようは書き方は良くないのでしょうか? 新しい現場で、後者の方の書き方をしたら、 「えっ、なんでメンバー変数で宣言してんの? なんで引数で渡してんの?馬鹿じゃないの?」 と、結構、傷つく言葉を受けました。 それはそうとして、 自分としては、「なぜ、やってはいけないのか?」 「自分の設計思想は、設計の方向性としてアリなのか?」などを知りたく、質問させて頂きました。 ご意見、ご鞭撻を宜しくお願い致します。 //----------------------------------------------------------- ★前提1:末端の派生クラスで、このクラスを継承することはない。 ★前提2:提供する処理は様々な処理で使われるユーティリティ機能 ◆案1 class 複雑なクラス //メンバ変数  変数1  変数2  (中略)  変数100 //メソッド private  long 複雑な処理 (void)      (略:色んなメンバー変数が登場するが、       どのメンバと、どのメンバが登場するかは、ソースを追いかけて確認する)  long 自由なタイミングで、色んなメンバ変数の値を書き換えてしまうメソッド (void)       (※上述の「複雑な処理」に登場する変数の取りうる値がフリーダムになる) となるよりも、 //----------------------------------------------------------- ◆案2  static long 複雑な処理 (必要な引数1、必要な引数2、必要な引数3)    (略:登場するINPUT、OUTPUTは、引数に列挙されているものだけ。)  static long 複雑な処理 (必要な引数97、必要な引数98、必要な引数99)    (略:登場するINPUT、OUTPUTは、引数に列挙されているものだけ。)  ※渡す値は、呼び元が意識するため、メンバ変数がどういう状況になっているかは、   メソッドの利用者が把握している。(タイミングも、取りうる値も、認識しやすい) の方が良いという考えなのです。 メンバ変数で書けば、確かに、宣言部、定義部のコーディングで引数のことを書かなくてよいので楽でしょうし、 インタフェースの検討不足で手戻りがあっても、引数の増減で、修正が不要ですし、楽だと思います。 しかし、 「どこからでもアクセスできる変数ばかり」だと、処理の認識も困難だし、バグの温床にもなってしまうことから、私は後者にも、優れている部分はあると考えているのです。 .

  • メンバ変数のサイズの増加

      こんにちは。  C++でクラスの大きさが重要になり、クラスのサイズを軽減しようとしていたんですが、メンバ変数 でbool型の変数を一つ追加しただけで 8byte増加してしまいました。  何故、bool型なのに8byteも増加してしまったのかわかりません。 そのクラスには仮想関数が二つあります。  それが原因で仮想関数が増すごとにクラスのサイズが増加するのは分かりますが、メンバ変数を一つ追加しただけで8byteも増加するのが理解できません。 その後bool型を追加したんですけどサイズは増えませんでした。  bool型をそのまま増やして9個目からまた8byte増えるようです。  何故1byteづつ増えていかないんでしょうか? よろしくお願いします。

  • privateのメンバ変数を直接取得するユーティリティ。

    privateのメンバ変数を直接取得するユーティリティ。 以前、あるプロジェクトでクラスのprivateメンバ変数をgetterメソッドがないのに直接取得できるクラスを使っているのを見ました。 オブジェクトとメンバ変数とかを引数に渡すと、Object型で返却されるようなテスト用のユーティリティクラスみたいでした。 クラスやパッケージなどを確認しなかったので、もしかしたらそのプロジェクトで独自に作ったのかもしれません。 ただオープンソースとかで存在するのであればテストに便利なので利用したいと考えています。 できればsetterメソッドがないprivateメンバ変数に設定できるクラスがあるとよいのですが・・・。 ご存知でしたら是非おしえてください。 希望している経緯はWebアプリケーションのクラスを作成すると、コンテナのオブジェクトがないと動かない場合も多く、単体試験がやりにくいのです。 easymockなど色々ありますが、生成したオブジェクトを対象クラスに渡してあげる必要があるものが多く(staticメソッドは対象外とか)、テストのためにsetterメソッドを実装する必要があります。 個人的には単体試験をやりやすくするために、本番では使用しないメソッドになるけれど、上記のようなsetterメソッドを作成するのはよいと考えています。 依存性を少なくさせて(意味が違うかもしれませんが)、試験がしやすくなれば保守性もあがるし、バグの発生率も少なくなると思っています。 ただ人によっては本番で動かないメソッドがあるのはおかしいという人もいます(実際に言われました)。 確かにそういう考えもあるかと思いますし、以前は私もそう思っていました。 試験のためのメソッドをクラスに作成する考えについても(主にテスト用なのでprotectedで作成しています)、やめた方がいいなどのアドバイスを頂けると嬉しいです。

    • ベストアンサー
    • Java
  • 変数に入っている変数の値を参照したい場合には

    var a1="123"; var a2="789"; と 変数に文字が登録されている場合、 引数として、1又は2を渡し、 1の場合にはa1を 2の場合にはa2の値を 参照することは可能ですか? switchやif文を使わずに、 別の変数に、"a"+引数を代入し、 その変数に代入されている変数を参照する というようなことは可能ですか? 意味わかりますか? すみません。 よろしくお願い致します。

  • 外部変数について

    今Vine Linuxを使ってC++でプログラムを書いているのですが教えて頂きたいことがあります. C++の初心者の為,変なことをお聞きしますがお許しください. extern宣言で他のソースのローカル変数を参照する方法はないのでしょうか? 例えば,a.cとb.cというソースがあったとします. a.cの関数内でint i;と宣言されている変数をb.cからextern int i;という風にしたいのですが, こうするにはa.cでグローバル変数としてint i;を定義する以外方法はないのでしょうか? できればグローバル変数を使いたくないのですがこれ以外では無理でしょうか? あともう一つお聞かせ下さい. メイン関数の引数を別の関数,またはソースで使うということはできないのでしょうか? int main( int argc, char *argv[] )のargv[1]というのを別の関数で使用したいのですがこれも無理でしょうか? 馬鹿な質問だとは思いますが,どなたかお答え頂けますでしょうか? よろしくお願いします.