- ベストアンサー
C++の練習をしています。
クラスAをmainでインスタンス化してそれを参照(もしくはポインタ)で他のクラスB内で生成したいのですが、具体的にはどうしたいいでしょうか? またこのような参照は「同期」と似ていると思ったのですが、意味が違うのでしょうか。 初心者で妙な質問かと思いますがどうぞよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
関連するQ&A
- クラスの練習をしています。
ある方から、「参照(もしくはポインタ)を使って、人オブジェクトがまるで建物オブジェクトAから建物オブジェクトBに移動したようにしなさい」と言うお題を頂きました。 「生き霊」がなんちゃらとも言ってたのですが、 私は、人クラスを例えばmainでインスタンス化して、その実体をコピーさせて建物クラスAと建物クラスBにそれぞれ置き、それらを同期させてみてはと考えたのです。 初心者なので説明が難解してると思いますが、もし意図しているものが汲み取れた方がいらっしゃったら、 クラスの参照(もしくはポインタ)の扱い方(?)を教えてください。
- ベストアンサー
- C・C++・C#
- 同一クラスインスタンス名で別クラスのインスタンス作成方法(C++)
下記ソース(Java)の処理をするような、C++の実装方法を教えていただきたいです。 【処理内容】 クラスBのインスタンスを保持しており、クラスBのインスタンス名と同一であるクラスAのインスタンス生成 ClassA A_Instance = (ClassA)Class.forName(B_instance.name).newInstance(); 要はクラスインスタンスの名前の求め方がわからないのです。それさえわかれば、newしてクラスポインタを返すメソッドを用意すれば何とかなると考えていますが。 ※C++のAPI一覧はどこにあるのだろうか・・・
- 締切済み
- C・C++・C#
- cocoa、objective-cのクラスをインスタンス化する順番を変えたいのですが可能なのでしょうか?
cocoa、objective-cなのですが NSTableViewのデータを用意するにあったて データを用意するクラス”A”がIBによってインスタンス化の設定がなされていて クラス”A”が用意するデータがクラス”B”を参照する仕様なのですが、 クラス”B”もIBによってインスタンス化の設定がなされていてIBOutletによって ”A”と”B”お互いに接続されているのですが、クラス”A”がデータを参照するときに まだインスタンス化もしくは接続がなされていないようなので インスタンス化する順番を変えたいのですが可能なのでしょうか? それとも何か他の原因なのでしょうか? ご存知の方教えていただけないでしょうか? よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- c# ポインタ代わりの配列 改定
こんにちは、c#初心者です。 先ほどの質問に回答がつかなかったので、内容が分かりにくいのだろうと思い改定しました。 汎用ライブラリを作っている途中で、引数にではなく、フィールドにポインタをもてたら良いのになと思う場面が時々あります。 「c#じゃ、クラスがポインタみたいなものだろ!」とおっしゃる方もいるかと思います。 Control c1 = new Control(); Control c2 = c1; とすれば、確かにc1もc2も同じインスタンスを参照することになりますから、メンバ書き換えても当然もう一方も変わっていることになります。 しかし、問題は互いにスコープ上見えていないクラス同士で同じ値を持ちたい場合、具体的にはあるクラスAのインスタンス内にbとcがあり、bとcで同じ値を参照したい場合です。 class SampleClassA { SampleClassB b: SampleClassC c: } 上記のような構造で、b, cともにある方のメンバ変数「value」を持っていたとします。 そして、例えばvalueがクラスのstring型だったとすると、 string text = "テキスト"; b.value = text; c.value = text; とすれば同じ値を参照することになります。が、 b.value = "あいうえお" とすると当然のことながらbのアドレスだけが変更され、cの値は変更されません。これをaの内部で行うのであれば、 b.value = "あいうえお"; c.value = b.value; のようにすればいいわけですが、bやcの中で value = "あいうえお"; としてしまうと完全にaもcも手も足も出ないわけです。 *value = "あいうえお"; が出来ないわけです。 何とかしようとすると、初心者は3つの方法を思いつきました。 1、イベントやデリゲート 2、SampleClassAに値を置いて、b, cからaを参照できるようにする。 1、ほとんど何でもでき、ある意味完璧ですが、消費メモリが増える上にデリゲートはパフォーマンス上ベストではない(ライブラリなので、別にAPIを作っているわけではないのですが)。 2、「スコープが大変混沌としてよろしくない」と初心者は思いました(多分あっていますよね?)。 3、それで、一度はこんなクラスを作りました。 public class Pointeric<T> { internal T _cont; public T Containt { get { //略 } set { //略 } } public SampleClass(T val) { //略 } } これでこのクラスのインスタンスを持っていれば *b.value = "あいうえお"; の代わりに b.value._cont = "あいうえお"; ができる。 また当然 c.value._cont は"あいうえお"になる しかし、msdnさんのクラス ライブラリ開発のデザイン ガイドラインとやらに「ライブラリはpublicなフィールドを持っちゃダメ」と怒られたのでinternalに。すると同じソリューション(ライブラリ)でもプロジェクトが異なればプロパティを使わざるを得ません。すると速度が全然出ないわけです。 そこで代わりに長さ1の配列をポインタ代わりに使うという手を(最近)思いつきました。 具体的には var _sharedValue = new Pointeric<int>(10); ------------------ _sharedValue.Containt = 5; などとしていたのが、 var _sharedValue = new int[1] { 10 }; ------------------ _sharedValue[0] = 5; という形になります。 気になるのが「この配列はポインタ代わりに使われているんだな」ということにXMLコメントと名前だけで気づいてもらえるかどうかという事です。 まだ経験が浅いので判断しかねます。皆さんのご意見を伺わせてください。また、「こんな方法もあるよ」というのがあればお願いします。
- ベストアンサー
- C・C++・C#
- C++のnewで確保した領域について
こんにちわ。C++を勉強し始めた者です。 new演算子を使ってインスタンスを生成した場合、それはスタックではなくヒープ領域に確保され、不要になったらdeleteを使って領域を解放しなければいけない認識です。 C++の初心者向けサンプルコードを見ていて疑問があったので質問させてください。 (例)クラスA.cpp ======================== #include <Car> #include <Garage> ~略~ クラスAのコンストラクタ{ Car *mycar = new Car("プリウス"); addGarage( mycar ); } クラスAのデストラクタ{ } ======================== 上記のような実装のクラスAがあったのですが、コンストラクタでCarクラスのインスタンス生成をして、オート変数の*mycarに格納して、Garageの公開関数に渡しています。 質問1:このクラスAをインスタンス生成した場合、コンストラクタで確保したヒープ領域は、プログラム終了時まで解放されない認識であっていますか? 質問2:オート変数の*mycarはコンストラクタからreturnした時点で解放されてしまうので、今のままではデストラクタでヒープ領域をdeleteできない認識であっていますか? 質問3:newで生成したインスタンスへのポインタは、その関数内でdeleteしない場合、メンバ変数やstatic変数、グローバル変数に格納しなければdeleteできなくなるという理解であっていますか? 質問4:C++のコードでnewした戻り値をオート変数に格納するプログラムは通常使うことはあるのですか?
- ベストアンサー
- 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
- 動的に生成されるインスタンス間のやりとりについて
あるクラスのインスタンスが動的に複数生成される状態で,一つのインスタンスから, 複数の他インスタンスのメンバ関数(仮に関数A)を呼びたいと考えています. そこでstaticなインスタンスのリストのようなものを設けようと考えました. 各インスタンスの関数Aへ関数ポインタの配列を定義し, それによって上記を実現しようと思いました. しかし,インスタンス生成前にインスタンス名を指定して (instance_name_.*p)(); という様に呼べるわけもなく,どう動的にインスタンスのリストを保持するかが思いつきません. 説明が下手ですいません.どなたか教えていただけますでしょうか. よろしくお願いします. 環境 Windows XP, cygwin
- 締切済み
- C・C++・C#
- C#のインスタンスを参照渡ししたい
メインのクラスAにウェブブラウザAがあります。 クラス A { メソッドA(){ ウェブブラウザA.Navigate(URL); } メソッドC(){ MessageBox.Show("これは成功"); } } クラス B { メソッドB(ウェブブラウザA){ ウェブブラウザA.Navigate(URL);//成功 } A a = new A(); a.メソッドA();//失敗 a.メソッドC();//成功 } このようなプログラムを作っています。 クラスBをインスタンスして実行すると クラスBのメソッドBは成功しますが、クラスAの方で宣言しているa.メソッドAは失敗します しかし、a.メソッドC();は成功します。 これは、a.メソッドAは、その上のA a = new A();でつくられた新しいインスタンスのなかで処理がされていて起動時につくられたクラスAのインスタンスとは別のものになっているからだと思うのですが、まちがいないでしょうか? この処理を成功させたい場合、起動時に作られたクラスAのインスタンスをメソッドBの引数に参照渡しですれば、 メソッドB(ウェブブラウザA){ ウェブブラウザA.Navigate(URL);//成功 メソッドA(); } も可能なのではないかと考えているのですが、可能でしょうか?またそのインスタンスを引数にする方法はどのようなものでしょうか? ちなみに、クラスBはDLLに置いてあり、メソッドAは複数のDLLで使うので毎度書くのは面倒なのでクラスAの中で呼び出して使いたいと考えています。
- ベストアンサー
- C・C++・C#
- Visual Studio(C#)のプログラミング
Visual Studio(C#)のプログラミングに関する質問です。 インクルードする2ファイルが、双方のクラスを互いに必要とするケースにおいて、 コンパイルが通らなくて困っています。(当たり前なのですが…) 【Aファイル】 クラスAの定義{ クラスBの使用(インスタンス作成、メソッド利用) } 【Bファイル】 クラスBの定義{ クラスAの使用(インスタンス作成、メソッド利用) } 【全体インクルードファイル】 #include Aファイル #include Bファイル 【コンパイル結果】 Bクラスが存在しません(Aファイルにて) 【質問】 お互いにクラス定義を必要とする場合、 ★具体的に★どのような実装をすれば良いのでしょうか?
- 締切済み
- C・C++・C#
- VB.NETでのEnumの使用について
こんにちは、いつも拝見させて頂いております。 今回は、VB.NETのEnumについて教えて頂ければと思い、投稿しました。 VB.NETでEnum定義をしているのですが、クラス内のEnumとして定義 しているのですが、そのクラスのインスタンスを生成しなくても クラス内のEnum定義が参照できます。 クラスのインスタンスを生成していないのであれば、そのクラス内に あるEnum定義も参照できないのではないかと考えていたのですが、 参照できたので、なぜなのかがわかりません。 自分なりに色々と調べたのですが、EnumがSystem.Enumを継承している というのはわかりましたが、それがなぜ、クラスのインスタンスを生成 しないで、クラス内のEnum定義が参照できることになるのかがわかりません。 言語は、VB.NET2005です。 一応、ここの質問一覧も検索してみたのですが、該当しそうなもの が見当たらなかったので、ここに投稿させてもらいました。 お忙しいところ、申し訳ありませんが、ご教授ください。
- ベストアンサー
- Visual Basic
お礼
ありがとうございました。