• ベストアンサー

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

ある方から、「参照(もしくはポインタ)を使って、人オブジェクトがまるで建物オブジェクト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

  • C++の練習をしています。

    クラスAをmainでインスタンス化してそれを参照(もしくはポインタ)で他のクラスB内で生成したいのですが、具体的にはどうしたいいでしょうか? またこのような参照は「同期」と似ていると思ったのですが、意味が違うのでしょうか。 初心者で妙な質問かと思いますがどうぞよろしくお願いします。

  • クラス?オブジェクト?インスタンス?何がなんだか・

    一般的なオブジェクト指向の 定義として下記で合っているのでしょうか お願いします クラス:第2実体(人間) インスタンス:第1実体(例:山田) オブジェクト:色々なインスタンスをさして、抽象的に総称としてオブジェクト 例えば・・クラス:人間、インスタンス:山田 クラス:犬、インスタンス:ゴン 違うクラスのインスタンスをまとめて呼ぶ際にオブジェクト? よく分からなくなっています、よろしくお願いします

  • 親クラスのポインタ、クラスを指定しないポインタ

    親クラス A (抽象メソッドX、Yの2つを持つ) と 子クラス B-1 (親はA、抽象メソッドX、Y、Zの3つを持つ) 子クラス B-2 (親はA、抽象メソッドX、Y、Wの3つを持つ) のように、子クラスでポリモーフィズムを実現しているとき、 クラスC   「実行時に、iniファイルに(1)と書かれていたら、B-1のクラスで実体化し、   iniファイルに(2)と書かれていたら、B-2のクラスで実体化する」  というクラスを作りたいです。 //////////////////////////////////////////////////////////////// 質問(1) その際、クラスCは、どうやってもZのメソッドや、Wのメソッドは書けない認識です。 (メソッド名もiniファイルから取るようにすれば別でしょうが。) この認識であっていますでしょうか? 質問(2) 逆に、XとYについては、それぞれ挙動の違う処理を行わせることができる認識です。 (クラスCで、親クラスAのポインタ型の変数を用意しておき、  そのポインタに、DLLのインスタンス化したものをいれておけば、  メソッドXとYについては実行可能という認識です)

  • インスタンス変数とクラス変数の違い

    1つのクラスオブジェクト内のインスタンス全てで共有できる クラス変数 @@a と、 同じインスタンス内であればメソッドの定義を越えてその値を 参照したり、変更したりできるインスタンス変数 @a のスコープの違いをお手すきでしたらご指導願えませんか? あとクラス変数にはセッターやゲッター等のアクセスメソッドを 設定できるんですか? いろいろ知りたいです。

    • ベストアンサー
    • Ruby
  • cocoa、objective-cのクラスをインスタンス化する順番を変えたいのですが可能なのでしょうか?

    cocoa、objective-cなのですが NSTableViewのデータを用意するにあったて データを用意するクラス”A”がIBによってインスタンス化の設定がなされていて クラス”A”が用意するデータがクラス”B”を参照する仕様なのですが、 クラス”B”もIBによってインスタンス化の設定がなされていてIBOutletによって ”A”と”B”お互いに接続されているのですが、クラス”A”がデータを参照するときに まだインスタンス化もしくは接続がなされていないようなので インスタンス化する順番を変えたいのですが可能なのでしょうか? それとも何か他の原因なのでしょうか? ご存知の方教えていただけないでしょうか? よろしくお願いします。

  • 同一クラスインスタンス名で別クラスのインスタンス作成方法(C++)

    下記ソース(Java)の処理をするような、C++の実装方法を教えていただきたいです。 【処理内容】 クラスBのインスタンスを保持しており、クラスBのインスタンス名と同一であるクラスAのインスタンス生成 ClassA A_Instance = (ClassA)Class.forName(B_instance.name).newInstance(); 要はクラスインスタンスの名前の求め方がわからないのです。それさえわかれば、newしてクラスポインタを返すメソッドを用意すれば何とかなると考えていますが。 ※C++のAPI一覧はどこにあるのだろうか・・・

  • クラス、インスタンス、オブジェクトの区別

    クラスが人間という種類だとしたら インスタンスが例えばAさん、Bさんという具体的な人のことで、 オブジェクトが誰でもいいけどとりあえず具体的な誰か という認識でいいでしょうか? だとしたらなんとなくイメージはできたのですが、もっとわかりやすい言葉が欲しいです。 どなたから説明してもらえませんか?

    • ベストアンサー
    • Java
  • templateクラスについて

    先ほど以下のようなプログラムを書いたのですがコンパイルを通すことができません。 //適当なポインタを保持するだけのクラス template <class _type> class hoge { private:   //適当に変数を保持   _type val; public:   //コンストラクタで適当に値をセット   hoge() : val( 0 ){}   //このクラスから唯一ポインタを引っ張ってくる方法   friend _type getVal( const hoge& foo )   {     // そのまま返す     return foo.val;   } }; void func( const hoge<int>& foo ) {   //値を引き出す   getVal( foo ); } void main() {   //実体化   hoge<int> foo;   //値を引き出す   getVal( foo );   //関数の先で値を引き出す   func( foo ); } 上記のようなプログラムを書いたのですが、main関数内でgetValを呼び出す場合はとくに問題ないのですがfunc関数を呼び出してfunc関数内でgetValを呼び出すと error C3861: 'getVal': 識別子が見つかりませんでした error C2365: 'getVal' : 再定義; 以前の定義は '以前は不明な識別子' でした。 コンパイルされたクラスの テンプレート のインスタンス化 'hoge<_type>' の参照を確認してください というエラーが出てしまいます。 func関数の引数を( const hoge<int>& foo )からvoid func( hoge<int> foo )のように参照渡しから実体渡しに変更するとコンパイルが通り、実行もできるのですが、なぜこれでコンパイルが通るのか理由がいまいちよくわかりません。 またやはり、コンストラクタ、デストラクタの問題などから実体渡しより、参照渡しを使いたいのですがどのようにプログラムを書けば今回の問題を解決できますでしょうか。 よろしくおねがいします。 /* VisualStudio2005 AcademicEdition MicroSoft WindowsXP Professional 32bit */

  • 【至急!】クラスの練習をしています。疑問です!もし

    同スーパークラスから継承させた2つのサブクラスをつくりました。 ひとつのサブクラスをインスタンス化し、そのサブクラス内でもう片方のサブクラスをインスタンス化して、 まるでインスタンスが(別の)新しいインスタンスを作るようにしてみることを考えました。 ところが、以下の条件下しか作れないようです。なぜですか? ・継承元が同スーパークラスではないクラス。 ・main関数内。 また、もし作れるならどのようにしたらいいでしょうか? ※C++の練習なのでcharを使っています。 #include <stdio.h> #include <cstring> #include <cstdlib> #include <ctime> class Ningen { protected: char Name[255]; public: /////////////////////// char *ReturnName(void){ return Name; } /////////////////////// }; //人間____名前をもち、与えられた名前を返す能力がある class Player : public Ningen { public: Player(void){ printf("____What's your name?:"); scanf("%s", Name); } }; //人間____Ningenを継承、名前をユーザにきいて名前を入力させる能力がある class Salesman : public Ningen { public: Salesman(const char *str){ strcpy(Name, str);//Name = str; printf("%s\n",Name); } }; //人間____Ningenを継承、名前を引数で入手して表示する能力がある class Build { protected: char BuildingName[255]; }; //建物____Buildという場所をクラスで用意。ここで人オブジェクトが動く。 class Company : public Build{ public: Company(const char *str){ strcpy(BuildingName, str);//BuildingName = str; printf("%s\n",BuildingName); } }; //建物____Buildを継承、名前を引数で入手して表示する能力がある int main(void){ Player *Player_p;//____プレイヤーのポインターを宣言 Player_p = new Player;//____インスタンスを生成してそれを代入 printf("____Are you name?:%s\n", Player_p -> ReturnName()); Company *Company_p; Company_p = new Company("____SystemConsultingCompany"); Salesman *Salesman_p; Salesman_p = new Salesman("____MINAMI"); delete Salesman_p; delete Company_p; delete Player_p; }

  • C++ クラスをメンバにもつクラスについて

    お世話になります。C++初心者でうまくコードが書けません(><) クラス1と2があり、クラス1のメンバにはクラス2があります。 メインでクラス1をインスタンス化してクラス2のfunc2を呼び出します。 func2ではクラス1のインスタンスから呼び出された場合にクラス1の m_int1を取得します。 Class Class1{ public:  int m_int1;  Class2 m_Class2; }; Class Class2{ public: void func2(); }; void Class2::func2(){  /*ここの記述方法が分かりません*/  /*C1から呼び出されたらC1のm_int1に100を入れる*/  /*以下間違え*/  class1 C2_1;/*別のclass1のオブジェクトなのでこれに入れてもダメっぽい*/  C2_1.m_int1 = 100; } void main(){  class1 C1;  C1.m_int1 = 10;  C1.m_class2.func(); } C1.m_class2.func()の中から呼び出したC1にアクセスする方法が 分かりません(TT)。実体がまだあるのだからアクセスする方法は あると思うのですが・・・ どなたかよろしくお願いします。