現在、ポリモーフィズムを使って、電卓プログラムを作っているんですが、コンパイルは通るんですが、アクションをおこしたら、フリーズしてしまいます。
ソースをのせますので、どなたか、ご指摘お願いします。開発環境はC++でWin32Apiです。
[抽象関数]
class Virtual{
public:
Virtual(){}
virtual ~Virtual(){}
virtual char RetOp() = 0;
};
[継承したクラス]
class Number : public Virtual{
char ch;
public:
Number(char s){ ch = s; }
virtual ~Number(){}
virtual char RetOp(){ return ch;}
};
[WndProc内]
static string str;
Virtual *PoliM = NULL;
switch(Message){
case WM_COMMAND:
switch(LOWORD(wParam)){
/*ボタン7が押されたら。*/
case ID_Bt:
PoliM = new Number('7');
break;
}
/*string型に7を足す。*/
str += PoliM->RetOp();
/*hEditは表示先*/
SetWindowText( hEdit, str.c_str());
delete PoliM;
}
よろしくお願いします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
WndProcでは、MessageがWM_COMMANDでないい場合も、wParamがID_Btで無い場合もありますから、
その場合にこのままだとPoliMがNULLのまま str += PoliM->RetOp(); を実行しようとします。
だから、#3の方の回答のような修正が必要になります。
ただし、PoliMはローカルの自動変数でNULLで初期化されるため、この場合は最後のNULL代入は不要です。
> switchの外で実行したいんですが、(じゃないと、ポリモーフィズムの意味が、、、)
中でもポリモーフィズムの意味はあると思います。
というか、これが中か外かは関係無いのでは?
この場合はVirtual,Numberというクラスがポイントでしょう。
回答ありがとうございます。
参考書に厳密に、
default: return;
を足すと、正常に動きました。
switch(LOWORD(wParam)){
case ID_bt: PoliM = new Number('7'); break;
default: return;
}
str += PoliM->RetOp();
SetWindowText( hEdit, str.c_str());
delete PoliM;
ご指摘どおり、MessageやwParamの状態で、PoliMがNULLのまま,PoliM->RetOp();を実行しているようす。
ただ、caseで用意した条件以外にdefaultが必要な理由が良く分かりません。
No.3
- 回答日時:
問題はやはり、PoliM==NULLの状態でPoliMへのアクセスが発生している所だと思われます。
なので、単純に問題の部分で実体が有る/無しの判定を行えば良いんじゃないかと…
例)
if( PoliM != NULL )
{
/*string型に7を足す。*/
str += PoliM->RetOp();
/*hEditは表示先*/
SetWindowText( hEdit, str.c_str());
delete PoliM;
PoliM=NULL;
}
注)
最後のPoliM=NULL;をお忘れ無く。
ただ、私はポリモーフィズムについての知識がありませんので、ご希望の動作になるかどうかは分かりません。
No.1
- 回答日時:
抜粋されたソースなので、ちょっと読み切れませんが、
PoliMが実態を持たないまま
str += PoliM->RetOp();
や
delete PoliM;
を実行している可能性はどうでしょうか?
PoliM==NULLの状態で上記の動作を実行しようとして、飛んじゃってる気がします。
早速の回答ありがとうございます。
Virtual *PoliM = NULL;
として、
case ID_Bt:
PoliM = new Number('7');
break;
で、実体化して
str += PoliM->RetOp();
この一連の操作は、参考書のポリモーフィズムのサンプルプログラムのままなのですが、
ただ、いろいろ試すと、
case ID_bt:
PoliM = new Number('7');
str += PoliM->RetOp();
SetWindowText( hEdit, str.c_str());
break;
と、このように、記述すると、期待どおりのアクションをします。
私としては、case ID_bt:の中は
new Number('数字');
だけにして、
str += PoliM->RetOp();
SetWindowText( hEdit, str.c_str());
は、switchの外で実行したいんですが、(じゃないと、ポリモーフィズムの意味が、、、)一体どこに問題があるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- その他(ソフトウェア) 辞書CD-ROMをISOに 2 2023/05/11 13:29
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
split関数で区切り文字がない場合
-
eclipseのjavaを実行できない
-
Eclipse(JAVA)のデバッグで他...
-
Javascriptの値をJava(JSP)へ渡...
-
eclipseでスタックサイズを変更...
-
JAVAにのeclipseに関する質問で...
-
コミット前の更新データをチェ...
-
Eclipseで実行>Javaアプリケー...
-
Javaで年月の取得(YYYYMM形式で)
-
eclipseが使えません
-
環境変数設定で
-
エクリプスで実行時、最新クラ...
-
eclipse実行ができない
-
javacでStackOverflowError
-
javascriptで、style undefined...
-
Spyder上のPythonでinputが実行...
-
NoClassDefFoundError: javax/m...
-
コマンドライン引数の掛け算の...
-
powershellのWin32_NetworkAdap...
-
「ワークスペースをビルド中」...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
split関数で区切り文字がない場合
-
「ワークスペースをビルド中」...
-
eclipseでスタックサイズを変更...
-
コミット前の更新データをチェ...
-
JAVAにのeclipseに関する質問で...
-
Javaで年月の取得(YYYYMM形式で)
-
Javascriptの値をJava(JSP)へ渡...
-
Eclipse(JAVA)のデバッグで他...
-
エクリプスで実行時、最新クラ...
-
jasper.exceptionとは?
-
環境変数設定で
-
eclipseで「サーバーで実行」表...
-
eclipseのjavaを実行できない
-
Worksheet_Changeが動かない
-
Google Colabでimport soxが出...
-
Javascriptのパーミッション
-
javaからVBAを実行する方法を教...
-
javascriptで、style undefined...
-
バイナリーコードと、ソースコ...
-
[JAVA]evalで文字列を計算式に!
おすすめ情報