2016-06-14 2 views
0

私はこのプログラムで問題が発生していたクラスの機能が、出力を初期化します。コンパイルすると、ユーザーの入力に基づいてすべての変数が初期化されますが、大文字と小文字のうちの1つについては問題が「0」であることが表示されます。何かご意見は?はまだ0

#include <iostream> 
#include <conio.h> 
#include <cmath> 
#include <stdexcept> 

using namespace std; 
class MortgageCalc 
{ 
protected: 
    float term; 
public: 
    void setData(float, float, float); 
    float setTerm(); 
    float monthly; 
    float total; 
    float interest; 
    int years; 
    float loan; 
}; 

void MortgageCalc::setData(float l, float i, float y) 
{ 
    loan = l; 
    interest = i; 
    years = y; 
    setTerm(); 
} 

float MortgageCalc::setTerm() 
{ //simple interest calculation with power calc to establish whole number translation 
    term = pow((1 + ((interest/100)/12)), (12 * years)); 
    return term; 
} 

class mPayment : public MortgageCalc 
{ 
public: 
    int monthly() 
    { 
     return ((loan * ((interest/100)/12) * term)/(term - 1)); 
    } 
}; 

class tPayment : public mPayment 
{ 
public: 
    int total() 
    { 
     return (monthly() * (years * 12)); 

    } 
}; 

class iPayment : public tPayment 
{ 
public: 
    int plusInterest() 
    { 
     return (total() - loan); 
    } 
}; 

int main() 
{ 
double loan(0), interest(0); 
int years = 0; 

MortgageCalc mort1; 
    cout << "Enter the total loan amount on your mortgage loan: $"; //established loan variable 
     cin >> loan; 
    cout << "Enter the interest rate (in whole #'s only): "; //establishes interest rate variable 
     cin >> interest; 
    cout << "Enter the length of the loan in years: "; //establishes term of payments 
     cin >> years; 
mort1.setData(loan, interest, years); 

mPayment m; 
     cout << "Monthly payment due is " << m.monthly() << "." << endl; 

tPayment t; 
     cout << "Total payment will be " << t.total() << "." << endl; 

iPayment i; 
     cout << "Total payment plus Interest will be " << i.plusInterest() << "." << endl; 

return 0; 
}; 
+0

なぜ 'int型ありません。 a = 5; int b; cout << b; 'print not 5? – immibis

答えて

0

あなたはそれらのライン上の既定のコンストラクタを使用します。

mPayment m; 
tPayment t; 
iPayment i; 

彼らはmort1で開催された以前の入力データの概念を持っていません。あなたはこのデータを「共有する」または「伝達する」方法を気にしませんでした。

mtiは全てランダムデータで初期化された。 mort1との関連はありません。

私はここで正しいアーキテクチャがどうなるかの詳細には触れませんが、基本クラスの初期化についてお読みください。ヒントとして、私はあなたがこの構文の作品を作ってみることができ、あなたの(少し奇妙な)の例で言うと思います:

mPayment m(mort1); 
+0

すべてのオブジェクト間で最も効率的にデータを共有するにはどうすればよいですか? – haynstyle

+0

"*ここでは正しいアーキテクチャがどのようなものになるのか詳しくは触れません*、それは本当に広いトピックです。元のソリューションを改善するには少なくとも5つの方法があります。このような単純な例では、効率についてあまり気にしないでください。私があなたに示した構文を作れば、あなたは十分に近いでしょう。あなたが 'mort1'を使ってオブジェクトを作成し、それを"分かりやすい "ものにし、"基底クラスの初期化について読む* "を行うようにしてください。 – luk32

+0

コンパイルに私はあなたが提案したコードを更新し、それはエラーmPayment「に一致するコール 『:: mPayment(mortgageCalc&』)私はそれがある右 – haynstyle

0

をあなたはMortgageCalc mort1; mPayment m; tPayment t; iPayment i;のように、すべての異なるオブジェクトを取っています。 これらのオブジェクトには何の関係もありません。

例:

mort1 = {term, monthly, total, interest, years, loan} 

し、1

mort1 = {term=1, monthly=1, total=1, interest=1, years=1, loan=1} 

で初期化しているが、両者は別の場所にメモリに格納されているので、それはMへの衝撃をdoesnot仮定する。あなたがチェックすることができ

m = {term=0, monthly=0, total=0, interest=0, years=0, loan=0} 

両方がcout<<&mort1<<endl<<&m;のような別のベースアドレスを持っています。あなたが設定した

データメンバがMortgageCalc mort1代わりのmPayment m; tPayment t;の一部です。

あなたがC++の基本的なのをブラッシュアップする必要があります。

+0

問題は、数学関数を実行している継承を持つ子クラスがあることです。 {term、Monthly、Total}は、最初に計算しなければならない関数なので設定できません。 int(毎月利息/ 100)/ 12)*期間)/(期限 - 1))に基づいて月額を初期化する必要があります。したがって、どのように私は初期化するか分からないときに外部からその関数を初期化するはずですか? – haynstyle

関連する問題