- 締切済み
オブジェクトのコピー
C++ on Vine2.4.20rev1です。 目標はタイトルのとおりなのですが、 状況がテキストとやや違うため、どうしたらよいか困っています。 ・classは、GameとPlayerの2つ ・コピー対象はPlayerのインスタンス ・今、プログラムはGame classのメンバ関数を実行中 ・Game classは、ポインタを介してPlayerインスタンスと 情報をやりとりする。 (インスタンスがどこにあるかは直接は知らない。) ・Game classが、インスタンスがどこにあるかを知っている場合には、 (つまり、Game classの中でPlayerを生成した場合。 これはテキストに出ていました。) コピーでき、しかも、別のインスタンスとして振る舞う。 ・知らない場合は、アドレスのみがコピーされているよう(?) 質問は、この状況において、「コピー元のPlayerインスタンスと コピーによって生成されたインスタンスが全く別個の インスタンスとして振る舞うようにするには どうすればよいのでしょうか。」ということです。 よろしくお願いします。
- C・C++・C#
- 回答数2
- ありがとう数3
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- nitscape
- ベストアンサー率30% (275/909)
operator = を実装してはどうでしょうか? class CTmp { public: int m_nTmp; void operator = (const CTmp& src) { m_nTmp = src.m_nTmp; } }; という感じです。 こうすると CTmp a; CTmp b; a = b; のようなオブジェクトのコピーが確実に(プログラマが意図したとおりに)動くようになります。
- HOGERA3
- ベストアンサー率35% (50/139)
いまいち質問の意味が理解できませんが、 「Prototype パターン」で解決するかもしれません。 // ところで、「テキスト」って教科書のことですよね? // 数分間「テキストファイル」だと思ってました。 // まあ、どうでもいいことですけど。
お礼
調べてみました。 http://tt.sakura.ne.jp/~suzu/tips/copy.html というページが見つかったのですが、 どうも派生クラスありきの説明で、よく分かりません。 Prototype パターンのいい書籍かHPを教えていただけますか?
補足
やや、すみません。テキストは教科書のことです。 Prototypeですか。調べてみます。 ありがとうございました。
関連するQ&A
- CMainFrameクラスなどのオブジェクトはどこで定義されていますか?
VC++6.0です。 SDIベースでスケルトンを作るとCMainFrameクラスなどが作られます。ソースの中でこれらのクラスのオブジェクトが生成されている部分を見たいのですが、見つかりません。 InitInstance()の中のRUNTIME_CLASS()があやしいような気がしますが、これなんでしょうか? ただしRUNTIME_CLASS()の関連ページを読んでもよくわかりませんでした。 今の目標はスケルトンで生成されたCMainFrameのオブジェクトのメンバにアクセスすることです。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- オブジェクト指向について質問
メインのクラスをインスタンスする際にコンストラクターに書かれている処理が実行されますが、オブジェクトが生成された時のイベントに書くのと、どのような違いがありますか? public partial class Form1 : Form{ public Form1()//コンストラクター {処理1} private void Form1_Load(object sender, EventArgs e)//インスタンス時のイベント {処理2} } また、別クラスの中でnewを使ってインスタンスがされ場合、コンストラクターと上記のイベントは同じように発生しますか? public class Form2{ Form1 = new Form1(); } よろしくおねがいします。
- ベストアンサー
- C・C++・C#
- オブジェクト指向の上手い使い方を教えてください
以下のような、クラスにまとめた処理を一度実行してるファイルがあります。 <?php class Hoge { public function __construct() { // 設定値 $this->a = 1; $this->b = 2; $this->c = 3; } public function main() { // 設定値を使った処理 print $this->a + $this->b + $this->c; } } // インスタンス生成・実行 $hoge = new Hoge(); $hoge->main(); ?> 設定値を変更して2回処理を行いたい場合、 一番スマートな形はどれになるか教えてください。 もしくは、それ以外の方法など。 1.設定値を引数で制御し、インスタンスを2回生成する (※設定値自体を引数に渡すことは考えてないです) <?php class Hoge { public function __construct($flg) { // 設定値 if ( $flg ) { $this->a = 1; $this->b = 2; $this->c = 3; } else { $this->a = 4; $this->b = 5; $this->c = 6; } } public function main() { // 設定値を使った処理 print $this->a + $this->b + $this->c; } } // インスタンス生成・実行 $hoge = new Hoge(true); $hoge->main(); // インスタンス生成・実行 $hoge = new Hoge(false); $hoge->main(); ?> 2.インスタンスの生成・実行は1度のままにし、クラスの処理を変更する <?php class Hoge { public function __construct() { // 設定値 $this->a = 1; $this->b = 2; $this->c = 3; $this->a2 = 4; $this->b2 = 5; $this->c2 = 6; } public function main() { // 設定値を使った処理 print $this->a + $this->b + $this->c; // 設定値の変更 $this->a = $this->a2; $this->b = $this->b2; $this->c = $this->c2; // 設定値を使った処理2回目 print $this->a + $this->b + $this->c; } } // インスタンス生成・実行 $hoge = new Hoge(); $hoge->main(); ?> 3.設定値を変更するメソッドを作り、呼び出す <?php class Hoge { public function __construct() { // 設定値 $this->a = 1; $this->b = 2; $this->c = 3; } public function change() { // 設定値変更 $this->a = 4; $this->b = 5; $this->c = 6; } public function main() { // 設定値を使った処理 print $this->a + $this->b + $this->c; } } // インスタンス生成・実行 $hoge = new Hoge(); $hoge->main(); $hoge->change(); $hoge->main(); ?> 4.子クラスを作り、2回インスタンス生成・実行を行う <?php class Hoge { public function __construct() { // 設定値 $this->a = 1; $this->b = 2; $this->c = 3; } public function main() { // 設定値を使った処理 print $this->a + $this->b + $this->c; } } class Hoge2 extends Hoge{ public function __construct() { parent::__construct(); // 設定値 $this->a = 4; $this->b = 5; $this->c = 6; } } // インスタンス生成・実行 $hoge = new Hoge(); $hoge->main(); // インスタンス生成・実行 $hoge = new Hoge2(); $hoge->main(); ?> 5.設定値だけ異なるファイルを作りそれぞれ実行する ※省略 よろしくお願いします。m(__)m
- 締切済み
- PHP
- メンバ関数へのアクセス
VC++6.0です。 class Aのインスタンスをたくさん作って そのポインタをvectorに格納しているとします。 添え字付けしてa[i]と表記しましょう。 iとjが異なっているとき、a[i]がa[j]のメンバ関数にアクセスすることはできますか? アクセスできるとしたら、その書式を教えてください。 要は、メンバ関数は、classのものなのか、 インスタンスに所属するものなのか、という疑問です。
- ベストアンサー
- C・C++・C#
- ネストトップクラス・メンバクラスについて
現在、SJC-P取得に向け独学でJavaの勉強中です。 ネストクラス・インナークラスについて勉強している最中なのですが、 数冊テキストを読み込んでも、web検索をしても、イマイチよくわからない・・・というのが正直なところです。 どのクラス(アウタークラス/staticインナークラス/非staticインナークラス)の、 どういうメンバ(static/非static/private/final)が、 どのクラスのどういうメンバにアクセス出来るのかが整理しきれません・・・。 わからないなりに、まとめてみたのですが、理解が不十分で、かつ、この下記の通りの理解で正しいのかどうかもわかりません。 (言葉でうまく表現も出来ていない箇所も・・) また理解すべきポイントに不足があるかと思います。 どこが正しく理解出来ているのか・どこがどう間違っているかの指摘及びその内容・理解不足の箇所・よりわかりやすい例の追加や補記など、どうかよろしくお願い致します。 ●staticなインナークラス(=ネストトップクラス)について ・アウタークラスのインスタンスなしに、staticなインナークラスのインスタンスの生成が出来る。 ・staticなインナークラスからはアウタークラスの非staticメンバを直接アクセス出来ない。 (→ただし、staticアウターメンバになら直接アクセス出来る?staticであればprivateでもアクセス可?) ・staticなメソッド内で非staticなインナークラスのオブジェクトが生成出来ない。 ●非staticなインナークラス(=メンバクラス)について ・非staticなインナークラス内にstaticなメンバを持つことは出来ない。 ・アウタークラスのインスタンスを生成してからでないと非staticなインナークラスのインスタンスは生成出来ない。 ・アウタークラスの非staticメンバ及びstaticメンバに直接アクセス出来る。 ●アウタークラス(=外部クラス)について ・アウタークラスのstaticメソッド内で非staticなインナークラスのインスタンスは生成出来ない。 ・非staticインナークラスのメンバ及び、staticなインナークラスのメンバにアクセス出来る。 --------------------------------------------------------- (例)処理はさておき、定義はこんな感じを思い描いております・・ class Outclass{ private int aa; private static int bb; private outMethod1(); private static outMethod2(); class NotStaticInner{ private int cc; //private static int dd;//不可 private inNotStaicMethod1(); //private static inNotStaticMethod2();//不可 } class StaticInner{ private int ee; private static int ff; private inStaticMethod1(); private static inStaticMethod2(); } } 参考テキスト: 『Sun Certified Programmer for Java2 Platform5.0 Exam【310-055】』のChapter11:「ネストクラス・インナークラス」 参考URL: http://wisdom.sakura.ne.jp/programming/java/java46.html
- 締切済み
- Java
- 動的に生成されるインスタンス間のやりとりについて
あるクラスのインスタンスが動的に複数生成される状態で,一つのインスタンスから, 複数の他インスタンスのメンバ関数(仮に関数A)を呼びたいと考えています. そこでstaticなインスタンスのリストのようなものを設けようと考えました. 各インスタンスの関数Aへ関数ポインタの配列を定義し, それによって上記を実現しようと思いました. しかし,インスタンス生成前にインスタンス名を指定して (instance_name_.*p)(); という様に呼べるわけもなく,どう動的にインスタンスのリストを保持するかが思いつきません. 説明が下手ですいません.どなたか教えていただけますでしょうか. よろしくお願いします. 環境 Windows XP, cygwin
- 締切済み
- C・C++・C#
- コンストラクタ
恐れ入ります。 たとえばSample classを定義するとして class Sample{ int a=0; int b=0; Sample(){ //まあ、この場合は通常省略ですが。 } } とコンストラクタの前に処理を書く場合と、 class Sample{ Sample(){ int a=0; int b=0; } とコンストラクタに書く場合とでは何か違いがあるのでしょうか?本を見ると「コンストラクタはインスタンスが生成されたときに呼び出される処理」とありますが、上のような記述でも「生成されたときに処理」されますよね・・・? インスタンスを生成するときに引数を使う場合には違いはわかるのですが・・・? 引数がない場合には「コンストラクタには意味はない」であっていますか?
- ベストアンサー
- Java
- Servlet上でのClass#forName()について
こんにちは。三田と申します。 Class#forName()で取得したClassオブジェクトが、Servlet上とそうでない場合で結果が違っていました。 実際、行っている処理は、あるクラスのClassオブジェクトをClass#forName()で取得して、次にそのクラスのインスタンスを生成して、Class#isInstance()をしているだけです。 上記の処理を行った場合に、Servlet上ではfalseで そうでない場合は、trueになるのです。 デバックしてみたところ、インスタンスを生成したときにServlet上では、Classオブジェクトの変数に値が入っていないのに対し、Servletを使用しない場合は、Classオブジェクトの変数に値が入っていました。 その違いは発見したのですが、なぜそうなるのかがわかりません。理由を知っている方がいらっしゃいましたら、ぜひご教授をお願いします。 以上、よろしくお願いします。
- 締切済み
- Java
- 【C++】クラス内のメンバ関数の占める領域
C++のことです(恐らく、他言語にも共通していると思いますが)。 例えば、 class a { void func(); }; という風なクラスがあったとして、これを a kurasu[100]; と言う風にインスタンスを生成した場合、メンバ関数funcも100個分作られるのでしょうか。 “関数が作られる”って言い方は適切でないかもしれませんが……。。。 100個分の関数用にメモリが割り当てられるのか、といったニュアンスです。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- javaにおけるシャローコピーとディープコピー
現在、javaによるプログラミングを行っています。 シャローコピーとディープコピーについてお聞きしたく質問させていただきます。 例えば、あるクラスDataをインスタンス化して、instance という名前のArrayListを作ったとします。 class Data{ int x; int y; int z; } それで、insというArrayListを別のData型のインスタンス化されたins2という型のArrayListにコピーしたいんですが。 現在は、 ins2.add(ins.get(~~)); といった感じで書いていて、処理の関係上途中、コピー元のinsをremove allで全部削除してしまっていたりしているんですが、ins2の中身は、insが削除されたにも関わらず何とも変化がなくて、一応目的の動きはしています。 シャローコピーの場合、参照元に何か変化があるとコピー先のものまで変化してしまうようなので、これは、ディープコピーということでいいんでしょうか?
- 締切済み
- Java
お礼
ありがとうございます。 CTmp a; CTmp b; a = b; の部分は、Game classに書くことになるかと思いますが Playerインスタンスは別の所ですでに生成されていて Gameインスタンスはplayerのアドレスを知っている (ポインタをもっている)だけなので、 これは出来ないようです。