- ベストアンサー
オーバーロード関数について質問があります。
今、病院の入院/外来患者のの状況と請求金額の計算のためのプログラムを作成しています (まだ完全なプログラムではありません)。 4つの引数(days, rate, medi, service)を持つ関数と2つの引数(medi, service)を持つ関数(関数名は同じ)を別々に計算させたいのですが、main()から呼ぶときにそれぞれ4つと2つの引数を指定しないと「0個の引数を持つオーバーロードされた関数はありません」と怒られてしまいますよね? しかし、どう指定してよいのか分かりません。 classはpatient.hの中で定義しているのでmainからは見えませんよね? なので"double charge_calc(medi, charge);"などとやってもシンタックスエラーになってしまいます。 どのように指定すればよいのか教えてください。 尚、OKWebの文字の制限がありますので今回は抜粋して載せますが、後で補足することもできます。 少し急いでいます。 どうかよろしくお願いします。 === main.cpp === total = inp.charge_calc(); cout << "Total: " << total << endl; total = outp.charge_calc(medi, service); cout << "Total: " << total << endl; === patient.cpp === double patient::charge_calc(short days, double rate, double medi, double service) { return (days * rate) + medi + service; } double patient::charge_calc(double medi, double service) { return medi + service; } === patient.h === class patient { public: patient(); virtual ~patient(); void ienter_information(); void oenter_information(); double charge_calc(short, double, double, double); double charge_calc(double, double); private: char condition; string fName; string lName; char sex; short days; double rate; double medi; double service; };
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
設計に問題があるような気がします。 ienter_information() で入力した値は、patient のメンバに保存されるので、charge_calc が引数を必要とする理由がありません。 例えば、 total = inp.charge_calc_type1(); total = outp.charge_calc_type2(); というような、違う計算をする関数を2つ作ればいいのではないでしょうか。 今の構造のままでなんとかしなければならないのなら、days、rate、medi、service を public にして、 total = inp.charge_calc(inp.days, inp.rate, inp.medi, inp.service); total = outp.charge_calc(outp.medi, outp.service); こんな感じに、つじつまあわせをするしかないです。
その他の回答 (2)
- gimmick
- ベストアンサー率49% (134/270)
既に#2の方が回答されていますが、ienter_information()で入力した値を利用するならば、charge_calc()の引数は必要ありません。 もし私がこのようなプログラムを作るとしたら、入院患者と外来患者を区別するためのメンバをpatientクラスに持たせます。そしてコンストラクタの引数で入院/外来のどちらかを指定し、クラスのメンバにセットします。ienter_information()とoenter_information()は1つにまとめ、関数内部で入院、外来を判断し、それぞれの処理を行うようにします。同様に、charge_calc()も1つにまとめてしまいます。
お礼
実は最初にclassを作ったときには"condition"という名前のメンバーがありましたが、入院患者と外来患者のリストを入力前から別々にするために敢えて今の方法にしました。今回は時間がないので出来ませんが、時間が出来次第、関数をまとめる方法も試したいと思います(明らかにその方がスマートですね)。 ありがとうございました!
補足
只今、修正中です。しばらくお待ちください。 m(__)m
- gimmick
- ベストアンサー率49% (134/270)
質問内容がいまいち理解できませんが...。 >4つの引数(days, rate, medi, service)を持つ関数と2つの引数(medi, service)を持つ関数(関数名は同じ)を別々に計算させたいのですが、main()から呼ぶときにそれぞれ4つと2つの引数を指定しないと「0個の引数を持つオーバーロードされた関数はありません」と怒られてしまいますよね? 0個の引数を持つ関数を定義していないのですから、当然の結果です。 >しかし、どう指定してよいのか分かりません。 4つの引数の関数を呼びたいのならば引数を4つ指定すればいいし、2つの引数の関数を呼びたいのならば引数を2つ指定すればいいです。ただし、引数の意味は私にはわかりませんが。 >classはpatient.hの中で定義しているのでmainからは見えませんよね? main.cppでpatient.hをインクルードしていれば見えます。そうでなければ見えません。必要ならインクルードしてください。
お礼
ありがとうございます。
補足
ようやく載せることが出来ますので、とりあえず全部載せます。 >4つの引数の関数を呼びたいのならば引数を4つ指定すればいいし、2つの引数の関数を呼びたいのならば引数を2つ指定すればいいです。 それは分かっています。 ただ、ienter_informationで入力した情報をここの引数として指定したいのですが、その方法が分からないという意味です。これで分かりますでしょうか? //mp101.cpp #include "patient.h" #include <iostream> #include <string> using namespace std; int main() { patient inp, outp; // 入院/外来患者 char which; static short icount = 0, ocount = 0; // 入院/外来患者数カウント double total; do { cout << endl << "'I'n-patient or 'O'ut-patient? (To quit, press 'Q'): "; cin >> which; if(which=='I') { icount++; inp.ienter_information(); total = inp.charge_calc(); cout << "Total: " << total << endl; } else if(which=='O') { ocount++; outp.oenter_information(); total = outp.charge_calc(); cout << "Total: " << total << endl; } else if(which=='Q') break; else cout << endl << "Invalid letter! Type I or O or Q." << endl; }while(which!='1' && which!='2'); return 0; } //patient.cpp #include "patient.h" #include <iostream> #include <string> using namespace std; patient::patient() { days=0; rate=0; } patient::~patient() { } void patient::ienter_information() { cout << "First name: "; cin >> fName; cout << "Last name: "; cin >> lName; cout << "Sex: "; cin >> sex; cout << "The number of days: "; cin >> days; cout << "The daily rate: "; cin >> rate; cout << "Medication charge: "; cin >> medi; cout << "Service charge: "; cin >> service; } void patient::oenter_information() { cout << "First name: "; cin >> fName; cout << "Last name: "; cin >> lName; cout << "Sex: "; cin >> sex; cout << "Medication charge: "; cin >> medi; cout << "Service charge: "; cin >> service; } double patient::charge_calc(short days, double rate, double medi, double service) { return (days * rate) + medi + service; //入院患者請求金額 } double patient::charge_calc(double medi, double service) { return medi + service; //外来患者請求金額 } //patient.h #ifndef PATIENT_H #define PATIENT_H #include <string> using namespace std; class patient { public: patient(); virtual ~patient(); void ienter_information(); void oenter_information(); double charge_calc(days, rate, medi, service); double charge_calc(medi, service); private: string fName; //first name string lName; //last name char sex; //sex short days; //the number of days spent in the hospital double rate; //the daily rate double medi; //charges for hospital services double service; //hospital medication charges }; #endif
お礼
そのつじつまあわせの案を採用しました。 実は total = inp.charge_calc(inp.days, inp.rate, inp.medi, inp.service); は質問をする前に最初に試した方法でした。 privateから外してpublicにしてしまえばよかったのですね。 また、お世話になるかもしれません。 ありがとうございました!
補足
只今、修正中です。しばらくお待ちください。 m(__)m