• ベストアンサー

計算してからコンストラクタに渡すか

メインクラスAからクラスBをインスタンス化します。 Bクラスが持つ変数Cには1~100までの数値がランダムで入ります。 ここで、AクラスであらかじめCを計算しておいてBクラスのコンストラクタに引数として渡すのか それともAクラスではBクラスを生成するだけで、 Bクラスのコンストラクタ内で変数Cの値を計算するのか どちらが良いでしょうか? お教えください。

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

場合による、と思います。 自分なら、本当にここに書いてある事柄だけならBのコンストラクタでCをランダム計算するように組みます。特に、Cの値をAが知っていてはいけない場合はCの値のゲッターすら作りません。 しかし、Aが全体的にCの値を何らかの形で管理する必要がある場合は、AでCをランダム計算して管理処理してBのコンストラクタに渡します。 あるいは、擬似乱数計算のアルゴリズムを変更できるようにするならば、そのアルゴリズムインターフェースを作って、そこからランダム値Cを取り出してBのコンストラクタに渡します。

pugera542
質問者

お礼

大変参考になりました。 乱数の生成を少し特殊な方法でやるので、あらかじめ計算することにしました。 ありがとうございました。

関連するQ&A

  • コンストラクタ

    恐れ入ります。 たとえばSample classを定義するとして class Sample{ int a=0; int b=0; Sample(){ //まあ、この場合は通常省略ですが。 } } とコンストラクタの前に処理を書く場合と、 class Sample{    Sample(){ int a=0; int b=0; } とコンストラクタに書く場合とでは何か違いがあるのでしょうか?本を見ると「コンストラクタはインスタンスが生成されたときに呼び出される処理」とありますが、上のような記述でも「生成されたときに処理」されますよね・・・? インスタンスを生成するときに引数を使う場合には違いはわかるのですが・・・? 引数がない場合には「コンストラクタには意味はない」であっていますか?

    • ベストアンサー
    • Java
  • C++変数宣言時のコンストラクタについて

    Java開発をこれまでやってきたのですが、 C++を学ぼうとしています。 C++では下記のように宣言した場合hogeは インスタンスになり、Hogeクラスのコンストラクタが呼ばれるようなのですが、 Hoge hoge; Hogeクラスのコンストラクタが下記のような引数を持つものしか定義されていなかった場合は どの様な振る舞いをするのでしょうか? Hoge(int num); Javaでは引数の有るコンストラクタしか宣言しなかった場合はデフォルトコンストラクタは 作られなかったと思うのですが、c++では引数のないデフォルトコンストラクタができてるのでしょうか? また、デフォルトコンストラクタが出来ていなかった場合、 Hoge hoge; というようにプリミティブ型のような変数宣言の仕方で引数有りのコンストラクタを呼ぶことは出来るのでしょうか?

  • インスタンス変数の特殊な参照

    次のようなクラスを考えたときに(特に意味があるものではないですが) class A{ int a; A(){ a = 10; B b = new B(); } } class B{ int b; B(){ b = 20; C c = new C(); } } class C{ int c; C(){ c = 20; } } Cのコンストラクタの中から、Aのインスタンス変数aやBでのbの値を 参照することって出来ないのでしょうか? 変数をクラス変数にする、引数として渡す以外の方法を探しています。

  • 【C#】クラスのコンストラクタ引数参照渡しでエラー

    C#の.NETでWindowsアプリを作成しております。 C++/CLI経験はありますが、C#は全くの素人です。 AクラスからBクラスに、Cクラスを参照渡しで渡し、 BクラスにてCクラスのメンバ変数の値を書き換えた後、 Aクラスでその値を使用するといったプログラムを作成しようと思っています。 Bクラスを生成する際に、コンストラクタの引数渡しにて、 Cクラスを渡す書き方をしたのですが、下記エラー エラー CS0051: アクセシビリティに一貫性がありません。 パラメータの型 'ref Test.C' のアクセシビリティは メソッド 'Test.B.B(ref Test.C)' よりも低く設定されています。 が発生してしまい、解決法が分かりません。 何か根本的なことが間違っているのでしょうか。。 解決策をご存知の方おられましたら、ご教示お願い致します。 下記にサンプルコードを記載します。 【Aクラス】 B b = new B( C c ); 【Bクラス】 namespace Test { public partial class B : Form { public B(ref C c) // コンストラクタ { InitializeComponent(); } } } 【Cクラス】 namespace Test { class C { public int hoge; } }

  • javaでのコンストラクタの実行

    javaでのコンストラクタの実行 フィールドにHello a=new Hello(); とかいてメインメソッドにもHello b=new Hello(); とかくとaインスタンスとbインスタンスのどっちのコンストラクタが先に実行されるんですか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 親クラスのコンストラクタは? 引数付きコンストラクタは?

    VisualBasic.NETです。 あるクラスを継承したクラスからインスタンスを作成したときに、派生クラスのコンストラクタは呼び出されると思うのですが、基本クラスのコンストラクタはどうなるのでしょうか? JAVAのように、super() で呼び出す必要があるのでしょうか? 自動で呼び出されるのでしょうか? それとも、そもそも呼び出せないのでしょうか? また、引数の個数が違うコンストラクタは、同じクラス内に設定できるのでしょうか? JAVAのコードを移植しようと考えているのですが、出来るのかどうかが分からずに悩んでいます。 ご存じの方、よろしくお願いします。

  • 継承における暗黙のデフォルトコンストラクター

    ”継承の際、スーパークラスで引数なしのコンストラクターが省略せずにきちんと記述されるなら、そのサブクラスでコンストラクターを記述しなくても、スーパークラスの引数なしのコンストラクターが受け継がれるためコンパイルエラーがおきない。”のは分かりますが”スーパークラスで引数なしのコンストラクターが省略され、かつサブクラスでコンストラクターを省略した場合”はなぜコンパイルエラーがおきるのでしょうか? 暗黙の内にスーパークラスにコンストラクターが生成され、それがサブクラスに受け継がれることは出来ないのでしょうか? 宜しく願います。

  • 【.NET】コンストラクタをあとで呼出す方法

    .NET初心者です。 今VB.NETでVB6向けの自作COMクラスライブラリを作成しています。 自作クラスはStreamWriterクラスのラッパークラスとしてStreamWriterと継承関係にあります。 COMは引数なしのコンストラクターを一つ用意しなければなりませんが、 StreamWriterクラスは引数なしのコンストラクタを用意されていないため困っています。 自作クラス自身もFileクラスのラッパークラスで引数として使う必要があるため 継承関係を維持してVB6に公開する必要があります。 この問題をなんとか解決する手法って存在するのでしょうか? ちなみにほかに考えた手法は下記です。 ・プロパティーに StreamWriterのインスタンスを用いて継承関係なしであとでinitメソッドを呼び出す   →Fileラッパークラスの引数でStreamWriter型に代入出来ないため不可 ・StreamWriterを引数に取るメソッドの実装をあきらめる   →極力したくない ・StreamWriterラッパークラスの引数なしコンストラクタでStreamWriterクラスの引数ありコンストラクタを呼ぶ   →後でファイルのパスを指定する方法が見つからないため不可 他言語はそれなりにやってきたのでコンストラクターをあとで呼び出すなんて出来ないのはなんとなくわかるのですが何せ.NETを触り始めたのが最近なのでよろしくお願い致します。

  • スーパークラスのコンストラクタの呼び出し

    こんにちは。 スーパークラスに引数のあるコンストラクタと引数のないコンストラクタをサブクラスで継承する際の質問です。 具体的に書くと下記になります。 class A { A () {} A (int i) {} } class B extends A { } 何がわからないかというと 『スーパークラスのA()は、サブクラスのBでわざわざ明示的にスーパークラスのコンストラクタ呼び出しをしなくても問題ないというのはわかるのですが、なぜスーパークラスのA(int)は、呼び出さなくても良いのかということです。』 もしかしたら基礎中の基礎かもしれませんが、ご教授よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 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した戻り値をオート変数に格納するプログラムは通常使うことはあるのですか?

専門家に質問してみよう