dポイントプレゼントキャンペーン実施中!

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

if(条件A){
classA object; // objectという名前でclassAをインスタンス化
}else{
classB object; // objectという名前でclassAとは別のclassBをインスタンス化
}
object.methodA(); // objectのmethodA関数を使用したい

A 回答 (3件)

同じ名前の変数にしたいということは、何か classA と classB に共通の性質 Base が存在して、



Base* pObj;
if ( some_condition ) {
 pObj = new ClassA();
} else {
 pObj = new ClassB();
}
pObj->do_something();

な風にできるのでは?
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/11/01 01:53

ポインタを使わずにとなると 同じ処理を複数回書いて


片方はclassA、他方はclassBといったコードになるでしょう

そうなった場合 メンテナンスやバクなどで同じ箇所を2回直さなければいけなくなります
片方直し忘れたなんてバグが発生しかねません

また今後同じような事象の遭遇した際に 必要なオブジェクトの種類が(ちょっと極端ですが)20とか30に増えたとしたどうなるでしょう
20箇所も30箇所も同じコードを書くのはナンセンスですよね

これを機会にがんばってみましょう

# 一部訂正
> といった具合に使えば newで作成したメソッドを呼び出します
といった具合に使えば newした『オブジェクトの』メソッドを呼び出します
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/11/01 08:05

メソッドの引数などは同じなのでしょうか


基本クラスclassORGを作成 切り替えたい関数(methodA)を仮想関数(virtual)で作成
classA/classBをclassORGの派生クラスとして定義
classA/classBにメソッドを実装

使用段階で classORG型のポインタ変数pObjを準備
if文の分岐の中で
pObj = new ClassA(); または pObj = new classB();
などとして実体を作る
pObj->methodA();
といった具合に使えば newで作成したメソッドを呼び出します

使用後は delete pObj; といった具合で後始末しましょう
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/11/01 01:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!