大きな条件分岐があって、その条件によって別のクラスを同じ名前でインスタンス化し、以降で使いたいのですが、うまくコンパイルが通りません。考えてみればifブロックの中だけで有効なインスタンスになってしまうので、当たり前かも知れません。どのようにすれば、使えるようになるのでしょうか。
以下にコードを載せます。正しい書き方を教えて下さい。
よろしくお願いします。
if(条件A){
classA object; // objectという名前でclassAをインスタンス化
}else{
classB object; // objectという名前でclassAとは別のclassBをインスタンス化
}
object.methodA(); // objectのmethodA関数を使用したい
No.1ベストアンサー
- 回答日時:
同じ名前の変数にしたいということは、何か classA と classB に共通の性質 Base が存在して、
Base* pObj;
if ( some_condition ) {
pObj = new ClassA();
} else {
pObj = new ClassB();
}
pObj->do_something();
な風にできるのでは?
早速のご回答、ありがとうございます。
おっしゃるとおり、classAとclassBは処理的に似ています。
ご回答くださったものは、親クラス型のポインタ変数に子クラスを代入するというやつですね。
こういう書き方が常套手段のようですね。参考になりました。
No.3
- 回答日時:
ポインタを使わずにとなると 同じ処理を複数回書いて
片方はclassA、他方はclassBといったコードになるでしょう
そうなった場合 メンテナンスやバクなどで同じ箇所を2回直さなければいけなくなります
片方直し忘れたなんてバグが発生しかねません
また今後同じような事象の遭遇した際に 必要なオブジェクトの種類が(ちょっと極端ですが)20とか30に増えたとしたどうなるでしょう
20箇所も30箇所も同じコードを書くのはナンセンスですよね
これを機会にがんばってみましょう
# 一部訂正
> といった具合に使えば newで作成したメソッドを呼び出します
といった具合に使えば newした『オブジェクトの』メソッドを呼び出します
No.2
- 回答日時:
メソッドの引数などは同じなのでしょうか
基本クラスclassORGを作成 切り替えたい関数(methodA)を仮想関数(virtual)で作成
classA/classBをclassORGの派生クラスとして定義
classA/classBにメソッドを実装
使用段階で classORG型のポインタ変数pObjを準備
if文の分岐の中で
pObj = new ClassA(); または pObj = new classB();
などとして実体を作る
pObj->methodA();
といった具合に使えば newで作成したメソッドを呼び出します
使用後は delete pObj; といった具合で後始末しましょう
早速のご回答、ありがとうございました。No.1の方と同じ手段ですね。
まだ勉強を始めて日が浅く、よくわからないところも多いですが、ポインタ変数で持つところがミソなんでしょうか。
ポインタを必要以上に使うのは、まだ自信がないのですが、こういう場合は、ポインタ変数でなければいけないのですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(Microsoft Office) VBA メール送信済で実行されるはずが、実行されない時があります。 2 2023/02/02 14:05
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- Visual Basic(VBA) VBA エクセル 条件の設定 1 2022/03/28 10:24
- その他(SNS・コミュニケーションサービス) 大至急お助け下さい。マストドンの或るインスタンスに登録したいのですが、ユーザー名で半角英数とアンダー 1 2023/08/25 10:33
- その他(ソフトウェア) Figma 1 2023/06/23 14:22
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETで、DLLを頂いたんですが...
-
Eval関数を使いたい!ドキュメ...
-
excel vba グラフ データラベル...
-
既定のコンストラクタがない?
-
FriendとPublicの違い。。。
-
ダイアログ表示時にチェックボ...
-
ボタンのオーナードローについて
-
エディットコントロールでEnter...
-
DataGridViewのセルに斜線を引...
-
C++ protectedにアクセス不可
-
CreateObjectとはどういう意味...
-
C++のclassを、ウインドウプロ...
-
【ASP.NET】 独自で作成したク...
-
このコンパイルエラーの意味に...
-
MFCのCListCtrlでスクロールを検出
-
CMainFrameクラスの使い方
-
windowプログラム ピクチャー...
-
DLLからEXEのクラスを呼び出す...
-
正規表現 [^/]+ の意味を教えて
-
【C++】相互参照
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETで、DLLを頂いたんですが...
-
excel vba グラフ データラベル...
-
ユーザーフォームのVBAエラー
-
c# ネットワークプログラム
-
条件によって別のクラスのイン...
-
C# フォームのShow()のオーバー...
-
Eval関数を使いたい!ドキュメ...
-
C#でVB.NETのReplaceコマンドを...
-
C#で別スレッドからメインform...
-
MSDNのリファレンスの見方が分...
-
c# nullは空集合として扱かって...
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
(UWSC) 「#32770」の意味わかり...
-
ダイアログ表示時にチェックボ...
-
CreateObjectとはどういう意味...
-
クラスのアドレスを引数として...
-
C++ protectedにアクセス不可
-
【ASP.NET】 独自で作成したク...
-
オブジェクト型の変数が定義さ...
おすすめ情報