• ベストアンサー

条件によって別のクラスのインスタンスを作成する場合

大きな条件分岐があって、その条件によって別のクラスを同じ名前でインスタンス化し、以降で使いたいのですが、うまくコンパイルが通りません。考えてみればifブロックの中だけで有効なインスタンスになってしまうので、当たり前かも知れません。どのようにすれば、使えるようになるのでしょうか。 以下にコードを載せます。正しい書き方を教えて下さい。 よろしくお願いします。 if(条件A){ classA object; // objectという名前でclassAをインスタンス化 }else{ classB object; // objectという名前でclassAとは別のclassBをインスタンス化 } object.methodA(); // objectのmethodA関数を使用したい

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

  • ベストアンサー
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

同じ名前の変数にしたいということは、何か classA と classB に共通の性質 Base が存在して、 Base* pObj; if ( some_condition ) {  pObj = new ClassA(); } else {  pObj = new ClassB(); } pObj->do_something(); な風にできるのでは?

aneja
質問者

お礼

早速のご回答、ありがとうございます。 おっしゃるとおり、classAとclassBは処理的に似ています。 ご回答くださったものは、親クラス型のポインタ変数に子クラスを代入するというやつですね。 こういう書き方が常套手段のようですね。参考になりました。

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

ポインタを使わずにとなると 同じ処理を複数回書いて 片方はclassA、他方はclassBといったコードになるでしょう そうなった場合 メンテナンスやバクなどで同じ箇所を2回直さなければいけなくなります 片方直し忘れたなんてバグが発生しかねません また今後同じような事象の遭遇した際に 必要なオブジェクトの種類が(ちょっと極端ですが)20とか30に増えたとしたどうなるでしょう 20箇所も30箇所も同じコードを書くのはナンセンスですよね これを機会にがんばってみましょう # 一部訂正 > といった具合に使えば newで作成したメソッドを呼び出します といった具合に使えば newした『オブジェクトの』メソッドを呼び出します

aneja
質問者

お礼

再度のご回答、どうもありがとうございました。 ポインタはこのように利用できるのですね。勉強になりました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

メソッドの引数などは同じなのでしょうか 基本クラスclassORGを作成 切り替えたい関数(methodA)を仮想関数(virtual)で作成 classA/classBをclassORGの派生クラスとして定義 classA/classBにメソッドを実装 使用段階で classORG型のポインタ変数pObjを準備 if文の分岐の中で pObj = new ClassA(); または pObj = new classB(); などとして実体を作る pObj->methodA(); といった具合に使えば newで作成したメソッドを呼び出します 使用後は delete pObj; といった具合で後始末しましょう

aneja
質問者

お礼

早速のご回答、ありがとうございました。No.1の方と同じ手段ですね。 まだ勉強を始めて日が浅く、よくわからないところも多いですが、ポインタ変数で持つところがミソなんでしょうか。 ポインタを必要以上に使うのは、まだ自信がないのですが、こういう場合は、ポインタ変数でなければいけないのですか?