以下のプログラムで間違っている部分が分かる方、ご指摘お願い致します。
私の稚拙な腕では、どこが間違っているのかさっぱり分かりません。
以下のプログラムは、クラスticketを継承して、airplaneTicket、cinemaTicketを作成し、チケットの情報を入力し、最後に出力するものです。コンパイルエラーの箇所はコメントアウトしておきました。メイン関数の中に計5箇所あります。
よろしくお願い致します。
#include<string>
#include<iostream>
#include<vector>
using namespace std;
class ticket{
public:
string ID;
string seat;
int price;
ticket(){
cout << "ticket default constructor" << endl;
ID="not Known"; seat="not Known";
}
ticket(string i, string t){
cout << "ticket parameter-constructor" << endl;
ID=i; seat=t;
}
virtual void setPrice(int p)=0;
void printInfo(){
cout << ID << " " << seat << endl;
}
};
class airplaneTicket: public ticket{
public:
string flight;
airplaneTicket(){
cout << "airplane default constructor" << endl;
flight="not known yet";
}
airplaneTicket(string i, string t, string f):ticket(i, t){
cout << "airplane parameter-constructor" << endl;
flight=f;
}
virtual void setPrice(int p){
string type;
cout << "enter class type: ";
cin >> type;
if(type=="business") price=p*2;
else price=p;
}
void priceInfo(){
cout << ID << " " << seat << " " << price << " " << flight << endl;
}
};
class cinemaTicket: public ticket{
public:
cinemaTicket(){
cout << "cinema default constructor" << endl;
}
cinemaTicket(string i, string t):ticket(i, t){
cout << "cinema parameter-constructor" << endl;
}
};
int main(){
ticket tList[100]; //error: invalid abstract type 'ticket' for 'tList'
tList[0]=new airplaneTicket("239", "d34", "f345"); //error: no match for 'operator=' in 'tList[0]
tList[1]=new airplaneTicket(); // error: no match for 'operator=' in 'tList[1]
tList[2]=new cinemaTicket("245", "a23"); //error: cannot allocate an object of abstract type 'cinemaTicket'
tList[3]=new cinemaTicket(); // error: cannot allocate an object of abstract type 'cinemaTicket
for(int i=0;i<4; i++){
tList[i].printInfo();
}
return 1;
}
No.2ベストアンサー
- 回答日時:
もしかしたら、以前にJavaをやっていませんでしたか?なんとなく、Javaの様な書き方なので。
メッセージからするとg++のようですので。
>ticket tList[100]; //error: invalid abstract type 'ticket' for 'tList'
ちゃんと理由が書いてあります。メッセージはこう続きます。
note: because the following virtual functions are pure within ‘ticket’:
note: virtual void ticket::setPrice(int)
ticket tList[100]は、ticketのインスタンスを100個作ろうとしてます(Javaと違って)
が、 純粋仮想関数ticket::setPriceがあるのでインスタンスは作成できずエラーになります。
後ろでnewでairplaneTicket、cinemaTicketを作って代入しているので、ここはticketへのポインタ ticket * でしょう
>tList[2]=new cinemaTicket("245", "a23"); //error: cannot allocate an object of abstract type 'cinemaTicket'
ここも同様、継承したcinemaTicket::setPriceが純粋仮想関数のままです。
>tList[0]=new airplaneTicket("239", "d34", "f345"); //error: no match for 'operator=' in 'tList[0]
new ariplaneTicketは「ariplaneTicketへのポインタ_を返します。
「ticketのインスタンス」 = 「ariplaneTicketへのポインタ」
という=演算子が定義されていないためのエラーです。
tListの宣言をポインタに変えることでエラーは出なくなります。
> tList[i].printInfo();
ポインタへ宣言を変えたので、
tList[i]->printInfo();
> return 1;
終了コードは「正常終了は0,異常終了は0以外」というのが普通です。
今回はこれで終了なのでよいのですが、本来はnewで確保したらdeleteで解放しないとメモリーリークを起こします。
以上を踏まえ、main関数だけ書くと
int main(){
ticket* tList[100];
tList[0]=new airplaneTicket("239", "d34", "f345");
tList[1]=new airplaneTicket();
tList[2]=new cinemaTicket("245", "a23");
tList[3]=new cinemaTicket();
for(int i=0;i<4; i++){
tList[i]->printInfo();
}
// メモリの解放
for(int i=0;i<4; i++){
delete tList[i] ;
}
return 0;
}
ご回答ありがとうございました。
ご指摘の通りJavaをやってました。しかし、それが裏目に出てabstructと同様に考えて処理しようとして失敗してしまったようです。また、純粋仮想関数は継承する全てのクラスで定義しなければならないことが分からなかったという勉強不足も失敗要因でした。
質問にコンパイラ名を書くべきでした。このような稚拙な質問に懇切丁寧にご回答下さってありがとうございました。もしまた質問するときがあるとしたら、もっと勉強して上で、分かりやすい質問を書くように心掛けます。
お陰様でうまくいきました。この度は本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java java final 1 2022/06/10 22:49
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
空ENTERの判別
-
C言語のポインターで詰まっている
-
C++での <iostream.h>と<iostre...
-
constexprについて
-
VC++で文字列から任意の文字を...
-
enumの値から定義名を文字列化...
-
名前空間でビルドエラー(LNK20...
-
VxWorks 6.4ソケット接続につい...
-
[Win + Eclipse + GCC]socketク...
-
VS2019でofstreamが未定義になる
-
構文エラーが出ているのですが...
-
DLLでダイアログ
-
セグメンテーションフォルトが...
-
wstringの主力
-
c++で、cvMatからvectorへの変...
-
EOFにならない?
-
c++のvirtual関数および継承に...
-
switch文のエラーについて
-
C++で縦の棒グラフ
-
STL string::findで見つからな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
enumの値から定義名を文字列化...
-
VC++で文字列から任意の文字を...
-
C言語 ストリームについて。
-
switch文のエラーについて
-
string型のフォーマット書式指...
-
構文エラーが出ているのですが...
-
空ENTERの判別
-
gccでコンパイル時のエラー
-
なぜ、C++の標準ヘッダをインク...
-
リモートデスクトップの接続元I...
-
JPEGやPNGが読めるLoadImage関数
-
mapの初期化
-
snprintfが使用できない。
-
atlbase.h と afxwin.hの同時定義
-
C言語のエラーを修正したい
-
CSting を TCHAR [] に変換した...
-
#include "fstream.h"
-
構造体配列のvectorへの変換と...
-
【C++】ヘッダ内でstringを格納...
-
CStringとString
おすすめ情報