-PR-
解決済み

オーバーロード関数について質問があります。

  • すぐに回答を!
  • 質問No.462009
  • 閲覧数1008
  • ありがとう数6
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 94% (166/176)

今、病院の入院/外来患者のの状況と請求金額の計算のためのプログラムを作成しています
(まだ完全なプログラムではありません)。

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
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2

設計に問題があるような気がします。
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);
こんな感じに、つじつまあわせをするしかないです。
補足コメント
libre

お礼率 94% (166/176)

只今、修正中です。しばらくお待ちください。 m(__)m
投稿日時 - 2003-02-03 04:52:12
お礼コメント
libre

お礼率 94% (166/176)

そのつじつまあわせの案を採用しました。
実は
total = inp.charge_calc(inp.days, inp.rate, inp.medi, inp.service);
は質問をする前に最初に試した方法でした。
privateから外してpublicにしてしまえばよかったのですね。
また、お世話になるかもしれません。
ありがとうございました!
投稿日時 - 2003-02-03 09:12:48

その他の回答 (全2件)

  • 回答No.1
レベル11

ベストアンサー率 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をインクルードしていれば見えます。そうでなければ見えません。必要ならインクルードしてください。
補足コメント
libre

お礼率 94% (166/176)

ようやく載せることが出来ますので、とりあえず全部載せます。

>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
投稿日時 - 2003-02-02 18:51:51
お礼コメント
libre

お礼率 94% (166/176)

ありがとうございます。
投稿日時 - 2003-02-02 19:11:17
  • 回答No.3
レベル11

ベストアンサー率 49% (134/270)

既に#2の方が回答されていますが、ienter_information()で入力した値を利用するならば、charge_calc()の引数は必要ありません。

もし私がこのようなプログラムを作るとしたら、入院患者と外来患者を区別するためのメンバをpatientクラスに持たせます。そしてコンストラクタの引数で入院/外来のどちらかを指定し、クラスのメンバにセットします。ienter_information()とoenter_information()は1つにまとめ、関数内部で入院、外来を判断し、それぞれの処理を行うようにします。同様に、charge_calc()も1つにまとめてしまいます。
補足コメント
libre

お礼率 94% (166/176)

只今、修正中です。しばらくお待ちください。 m(__)m
投稿日時 - 2003-02-03 04:51:07
お礼コメント
libre

お礼率 94% (166/176)

実は最初にclassを作ったときには"condition"という名前のメンバーがありましたが、入院患者と外来患者のリストを入力前から別々にするために敢えて今の方法にしました。今回は時間がないので出来ませんが、時間が出来次第、関数をまとめる方法も試したいと思います(明らかにその方がスマートですね)。
ありがとうございました!
投稿日時 - 2003-02-03 09:18:37
このQ&Aで解決しましたか?
関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-

特集


開業・独立という夢を持つ人へ向けた情報満載!

ピックアップ

ページ先頭へ