• ベストアンサー

クラスの練習をしています。

ある方から、「参照(もしくはポインタ)を使って、人オブジェクトがまるで建物オブジェクトAから建物オブジェクトBに移動したようにしなさい」と言うお題を頂きました。 「生き霊」がなんちゃらとも言ってたのですが、 私は、人クラスを例えばmainでインスタンス化して、その実体をコピーさせて建物クラスAと建物クラスBにそれぞれ置き、それらを同期させてみてはと考えたのです。 初心者なので説明が難解してると思いますが、もし意図しているものが汲み取れた方がいらっしゃったら、 クラスの参照(もしくはポインタ)の扱い方(?)を教えてください。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

よくXXを使って~しろ、という問題がありますが、そればかり考えていると、たいていは思いつかないものです。 一旦、C++だのプログラムだのを捨てて、問題を整理する。図に書いたり模型を使ったりして考える。 これだったら、プログラミングは初心者でも、ある程度生きてきた人間だったら自分の知恵と知識の範囲でできますよね? プログラムにするのは、その後です。考えがまとまっているので、あとは、それをプログラムで実現するにはどんな方法があるのか考えていくだけです。 ここはプログラミング初心者には難しいかもしれません。しかし、考えがまとまっているので、自分の知りたいのは何か、はっきりしているはずです。ならば、質問でも検索でも、そのピンポイントを具体的にできるはずです。漫然と「わからない」と言っているよりはるかに簡単に解決できます。 さて。 > 人クラスを例えばmainでインスタンス化して、その実体をコピーさせて建物クラスAと建物クラスBにそれぞれ置き、それらを同期させてみてはと考えた では、これを、コンピュータを使わずに、現実っぽく考えてみましょうか。 人クラスの実体なので、例えば、質問者自身で考えましょう。 「実体をコピー」ということは、クローン人間を作る、ということです。クローンはそっくりではありますが、あなた自身ではありません。あくまで、そっくりな別人です。 「建物クラスAと建物クラスBにそれぞれ置き」なので、建物Aにはあなたが、建物Bにはクローンがいます。二人クローンを作って建物Aには クローンAが、建物BにはクローンBでもいいでしょう。 「それらを同期させて」というのは、時々ケータイをかけて情報交換するようなものです。ここのランチはお得だよ、とか。 さて、これを建物AからBへの移動、と言っていいものでしょうか? 「情報が同じなら、同じ物」という見方もできます。が、今回の意図とは違うように思います。 では、どうするか。 一つは、人に「現在位置」についての情報を持たすことです。 場所をコピーしてしまってはおかしいので、「この建物にいる」という矢印を付ければよいでしょう。 C++で「矢印」の代りになるものと言えば、ポインタや参照ですね。 もう一つは、入出管理ノートみたいなものを建物側で用意することです。 建物に入ったら名前を書いて、出るときに消します。 C++で、名前の代りになるものとして、変数名や、番号を割り振ったメンバ変数とかでもいいですが、確実に区別する方法として、ポインタのアドレスや参照があります。 これで大分先が見えてきませんかね? > クラスの参照(もしくはポインタ)の扱い方(?)を教えてください これについては、C/C++の基本であり最大の難関です。ここでちょっと書いた程度で理解できるものでもありません。 どの本でも多くのページをさいてますし、専用の本や講座があるくらいです。 そういうもので御自身で勉強することをお勧めします

rivalknockout
質問者

お礼

具体的な例と 問題解決への汎用的なアルゴリズムも添えていただいてたいへんためになりました。 ありがとうございます。またみかけたときはよろしくお願いします。

その他の回答 (1)

回答No.2

struct Human { ... } struct Building { Human* p; } Building a,b; Human h; a.p = &h; b.p = 0; // 人は建物A にいる。 b.p = a.p; a.p = 0; // AからBへ a.p = b.p; b.p = 0; // BからAへ ...こんだけのことではなくて?

rivalknockout
質問者

お礼

こういうやりかたもあるのですね。 勉強になります。

関連するQ&A