配列であるメンバのコンストラクタを呼ぶ方法
- C++のクラスにおいて、配列であるメンバのコンストラクタを呼び出す方法について教えてください。
- クラスAをメンバとして持つクラスBでは、ClassAのコンストラクタを呼び出すことができますが、メンバが配列の場合、どのようにコンストラクタを呼び出せば良いのでしょうか。
- ClassCのようにメンバが配列の場合、そのメンバのコンストラクタを呼び出すためにはどのような方法を用いれば良いのでしょうか。
- ベストアンサー
配列であるメンバのコンストラクタを呼ぶ方法
C++のクラスについて教えていただけないでしょうか。以下のような場合、 class ClassA { int A; public: ClassA(int a): A(a) {} }; class ClassB { ClassA A; public: ClassB(): A(10) {} }; class ClassC { ClassA A[2]; public: ClassC() {} //配列であるメンバのコンストラクタを呼び出したい }; ClassBがClassAのコンストラクタを呼ぶには上記のような方法で良いと思うのですが、ClassCのようにメンバが配列の場合、そのメンバのコンストラクタを呼ぶにはどのようにしたら良いのでしょうか。ご教授をお願いします。
- kary
- お礼率95% (82/86)
- C・C++・C#
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> コンストラクタに引数を渡したいのです できません。std::vector を使えば: class ClassC { std::vector<ClassA> A; public: ClassC() : A(2,ClassA(123)) {} };
その他の回答 (1)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
配列の場合、引数のないコンストラクタなら自動的に呼んでくれます。
補足
ご回答、ありがとうございます。説明が不足していて申し訳ありません。配列の場合でもデフォルトコンストラクタが呼ばれるのは分かるのですが、コンストラクタに引数を渡したいのです(ClassAのようにデフォルトコンストラクタがないクラスを考えています)。
関連するQ&A
- 参照メンバを持つクラス
ClassAとClassBにCMyDataオブジェクトを渡したいのですが、メモリ上に同じデータのコピーを作りたくないので、コンストラクタがCMyDataの参照を受け取る設計にしました。こうすることで、CMyDataの実体はメモリ上に1つしか存在しないことになります。 ただ、クラスが、自身が管理していない外部領域にあるデータへの参照を使って仕事をするというのに違和感を感じます。 完全コンストラクタというデザインパターンがあって、クラスのインスタンスを生成する時に必要な全てのデータを渡すのが正しい流儀だそうです。 しかしこのClassA(B)の設計では、ClassA(B)の寿命が終わるまで参照先のデータが生きているとは限りません。もっといい設計はないでしょうか?ちなみにCMyDataは実際にはかなり大きなデータで、一時的であってもコピーを複数持ちたくないのです。ClassAとClassBは、実際は他のデータも参照するため1つのクラスにはしたくないのです。 class CMyData { // 色々なデータ }; class CMain { CMyData* myData; // ファイルからデータを読み込んで生成 ClassA* objA; ClassB* objB; void ReadFile() { myData = new CMyData(); // ファイルからデータを読み込みCMyData構築 } void Init() { ReadFile(); objA = new ClassA(*myData); // 自身のメンバ変数の参照でClassAを構築 objB = new ClassB(*myData); } void DoProcess() { Init(); // 実行は一度だけ objA->hoge(); // ClassAに仕事をさせる objB->foo(); // ClassBに仕事をさせる } } class ClassA { CMyData& m_data; public: ClassA(CMyData& data) m_data=data; // CMyDataオブジェクトを参照で受け取る void hoge(); } class ClassB { CMyData& m_data; public: ClassB(CMyData& data) m_data=data; // CMyDataオブジェクトを参照で受け取る void foo(); }
- 締切済み
- C・C++・C#
- コンストラクタ内で別のコンストラクタは呼べますか?
こんにちは。 class CFoo { CFoo( int a ){} // 1 CFoo( float b ){} // 2 CFoo( bool c ){} // 3 CFoo( int a, float b, bool c ) // 4 { } } ; 上記のようなクラスで 4 番目のコンストラクタが呼ばれた場合に、 a, b, c のパラメータを使って、1、2、3 を呼ぶようなことは可能でしょうか ? もしご存じの方がいらっしゃいましたら教えて頂けないでしょうか。
- ベストアンサー
- C・C++・C#
- デフォルトコンストラクタについて
クラスについて、デフォルトコンストラクタについて理解が乏しいのですが、クラスB側で何か細工をすると、クラスAのデフォルトコンストラクタ無しで、エラーなくコンパイルできるのでしょうか? 派生クラスの親のベースクラスのコンストラクタを呼ぶsuper?でOKなのでしょうか? #include "stdafx.h" class A { public: //A(){} // これをコメントアウトにすると // error C2512: 'B' : クラス、構造体、共用体にデフォルト コンストラクタがありません。 A(int x){} ~A(){}; }; class B : A { }; void main(void){ B b; }
- ベストアンサー
- C・C++・C#
- クラスメンバの中で配列を利用したい
Cで書いたプログラムをC++に移植してます。 普通の変数はクラスメンバに置き換えてしまえばよろしいのですが、 配列の場合そのままクラスメンバに置き換えたら 問題が発生します。(予想はついていたのですが…) class test{ private: int m_test[100]; }; クラスメンバを配列に設定するにはどうすればよいですか?
- 締切済み
- C・C++・C#
- Rails AR 深い階層のテーブル参照
Rails ActiveRecord において、 深い階層のテーブルを参照するのに有効な方法はないでしょうか? 例:下記の構造で classD から classAのnameを取得する。 classA 1→n classB 1→n classC 1→n classD □classA id name □classB id name class_a_id □classC id name class_b_id □classD id name class_c_id #前提条件 classC, classB, classAが必ずしも存在するとは限らない。 classDからclassAを参照する際に、#前提条件にあるように、 classB or classCが存在しない(nil)場合、 > class_d.class_c.class_b.class_a.name とするとエクセプションが発生しますが、 これを回避するために、 if class_d.class_c and class_d.class_c.class_b and class_d.class_c.class_b.class_a class_d.class_c.class_b.class_a.name end のようにしていますが、煩わしくてしかたがありません。 実際はエラーログ出力等行っているため、さらに複雑な処理になっています。 もっとスマートなコーディング方法やアドバイスがありましたら宜しくお願いします。 #補足 (1) has_many :through を使ってショートカットが作れることを知りましたが、 今回の例のように、複数階層となる場合の記述方法がわかりません。 ご存知の方回答お願いいたします。 (2) そもそも前提条件に問題があるのではないかとも思っています。 前提条件にあるような状態にならない様な仕組みにする、 もしくは、そのような状態にならないよう管理する、等すべきでしょうか? 以上宜しくお願いいたします。
- ベストアンサー
- Ruby
- クラスがメンバーとしてクラスを持つ時の宣言について
自作クラスMainClassがMyClassというクラスをメンバー変数として持つ場合、宣言時に引数をいくつか持つコンストラクタを呼び出そうとすると構文エラーとなります。 class MyClass { public: MyClass(int, int); } class MainClass { private: MyClass myclass(10,10); } このような宣言はできないのでしょうか。 引数なしのコンストラクタは呼び出せているようです。
- ベストアンサー
- C・C++・C#
- 継承元クラスのプロパティを参照する手段
お世話になります。 ActionScrip3に関する質問です。 現在、カスタムクラスを勉強しております。 外部クラスでClassA、ClassBを作成し、 ClassAにある処理の途中でClassBを実行し、ClassBの中からClassAのプロパティを参照しにいく 処理を行いたいと思い、ClassBのコンストラクタからClassAのプロパティをtraceしました。 プロパティppt2は「かきくけこ」が出力されましたが、ppt1は「null」になってしまいました。 恐らく、タイムラインからClassAに対して設定したプロパティの値は見にいけていないようですが、 タイムラインから設定したプロパティの値を継承したClassBから参照しにいく方法はありますでしょうか? 下記ソースと同じ方法でなくても結構ですので、タイムラインから設定した スーパークラスのプロパティ値をサブクラスから参照・変更できる方法を ご教授いただければと存じます。 お手数ではありますが、宜しくご教授ください。 宜しくお願いいたします。 /* タイムライン側の処理 -----------------------*/ var test:ClassA = new ClassA(); test.ppt1 = "あいうえお"; test.goNext(); /* ClassAの処理 -----------------------*/ package { // インポート記述は省略 public class ClassA { var ppt1:String; var ppt2:String = "かきくけこ"; // コンストラクタ public function ClassA() { } public function goNext():void { var classb:ClassB = new classB(); } } } /* ClassBの処理 -----------------------*/ package { // インポート記述は省略 public class ClassB extends ClassA { // コンストラクタ private function ClassB() { trace(ppt1); trace(ppt2); } } }
- ベストアンサー
- Flash
- コンストラクタ
恐れ入ります。 たとえばSample classを定義するとして class Sample{ int a=0; int b=0; Sample(){ //まあ、この場合は通常省略ですが。 } } とコンストラクタの前に処理を書く場合と、 class Sample{ Sample(){ int a=0; int b=0; } とコンストラクタに書く場合とでは何か違いがあるのでしょうか?本を見ると「コンストラクタはインスタンスが生成されたときに呼び出される処理」とありますが、上のような記述でも「生成されたときに処理」されますよね・・・? インスタンスを生成するときに引数を使う場合には違いはわかるのですが・・・? 引数がない場合には「コンストラクタには意味はない」であっていますか?
- ベストアンサー
- Java
- スーパークラスのコンストラクタの呼び出し
こんにちは。 スーパークラスに引数のあるコンストラクタと引数のないコンストラクタをサブクラスで継承する際の質問です。 具体的に書くと下記になります。 class A { A () {} A (int i) {} } class B extends A { } 何がわからないかというと 『スーパークラスのA()は、サブクラスのBでわざわざ明示的にスーパークラスのコンストラクタ呼び出しをしなくても問題ないというのはわかるのですが、なぜスーパークラスのA(int)は、呼び出さなくても良いのかということです。』 もしかしたら基礎中の基礎かもしれませんが、ご教授よろしくお願いいたします。
- ベストアンサー
- Java
- 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)。実体がまだあるのだからアクセスする方法は あると思うのですが・・・ どなたかよろしくお願いします。
- ベストアンサー
- C・C++・C#
お礼
ご回答ありがとうございます。