Díky za snahu ... zkusím to. No já se ten kód snažil co nejvíc zkrátit a tak to asi vypadá jako blbost. Hážu to sem teda celý ať víš o co jde.
BTW: Je to opsaný z knihy Mistrovství v C++ nedělal sem to já. Jen je tam úkol předělat hlavní a odvozenou třídu tak, aby sem udělal virtuální třídu a pak obě ty třídy odvodil z ní. Tak se o to pokouším ale hlásí mi to chybu na řádku s tím přiřazením (vytučnil sem ho).
#include <iostream>
using namespace std;
#include "mistrovstvi43a.h"
#include "mistrovstvi43b.h"
const int SIZE = 3;
const int MAX = 35;
inline void EatLine() { while (cin.get() != '\n') continue; }
int main()
{
BankAccount pokus;
Overdraft pokus2;
BankAccount * baps[SIZE];
char name[MAX];
long acctNum;
double balance;
int acctType;
int i;
for (i = 0; i < SIZE; i++)
{
cout << "Zadejte jmeno klienta: ";
cin.get(name, MAX);
EatLine();
cout << "Zadejte cislo uctu klienta: ";
cin >> acctNum;
cout << "Zadejte pocatecni zustatek klienta: ";
cin >> balance;
cout << "Chcete-li Brass Account, zadejte 1, chcete-li Brass Plus"
<< "Account, zadejte 2: ";
cin >> acctType;
EatLine();
if (acctType == 2)
baps[i] = new Overdraft(name, acctNum, balance);
else
{
baps[i] = new BankAccount(name, acctNum, balance);
if (acctType != 1)
cout << "Interpretovano jako 1.\n";
}
}
for (i= 0; i< SIZE; i++)
{
baps[i]->ViewAcct();
cout << endl;
}
cout << "Nashledanou!\n";
system("PAUSE");
return 0;
}
Tak mě napadá ... když už to sem teda hážu celý, jestli mi to nechceš zkontrolovat a doporučit lepší řešení, protože fakt nevim jetsli tak jak sem to udělal je to to pravý ořechový.
Virtuální třída:
#ifndef _BANK_H_
#define _BANK_H_
class Bank
{
private:
enum { MAX = 35 };
char fullName[MAX];
long acctNum;
public:
Bank(const char *s = "Nullbody", long an = 0);
virtual double Balance() const = 0;
void ViewAcct() const;
};
#endif
************ DEFINICE FUNKCÍ *****************
#include <iostream>
using namespace std;
#include "mistrovstvi43c.h"
Bank::Bank(const char *s , long an)
{
strcpy(fullName, s);
acctNum = an;
}
void Bank::ViewAcct() const
{
ios_base::fmtflags initialState = cout.setf(ios_base::fixed, ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout.precision(2);
cout << "Klient: " << fullName << endl;
cout << "Cislo uctu: " << acctNum << endl;
cout.setf(initialState);
}
Odvozená třída 1:
#ifndef _BANKACCT_H_
#define _BANKACCT_H_
#include "mistrovstvi43c.h"
#include "mistrovstvi43b.h"
class BankAccount : public Bank
{
private:
double balance;
public:
BankAccount(const char * nam = "Nullbody", long act=0, double bal = 0.0);
void Deposit(double amt);
void Withdraw(double amt);
void ViewAcct() const;
double Balance() const;
};
#endif
********* DEFINICE ČL. FUNKCÍ **********
#include<iostream>
using namespace std;
#include "mistrovstvi43a.h"
#include <cstring>
BankAccount::BankAccount(const char * nam, long act, double bal) : Bank(nam, act)
{
balance = bal;
}
void BankAccount::Deposit(double amt)
{
balance += amt;
}
void BankAccount::Withdraw(double amt)
{
if (amt<=balance)
balance -= amt;
else
cout << "Pozadovana castka $" << amt
<< "prevysuje zustatek.\n"
<< "Vyber stornovan.\n";
}
void BankAccount::ViewAcct() const
{
ios_base::fmtflags initialState = cout.setf(ios_base::fixed, ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout.precision(2);
Bank::ViewAcct();
cout << "Zustatek: $" << balance << endl<<endl;
cout.setf(initialState);
}
double BankAccount::Balance() const
{
return balance;
}
Třída č. 2:
#ifndef _OVERDRF_H_
#define _OVERDRF_H_
#include "mistrovstvi43c.h"
class Overdraft : public Bank
{
private:
double balance;
double maxLoan;
double rate;
double owesBank;
public:
Overdraft(const char * s = "Nullbody", long an = -1, double bal = 0.0, double ml = 500,
double r = 0.10);
Overdraft(const Bank & ba, double ml = 500, double r = 0.1);
void ViewAcct() const;
void Withdraw(double amt);
void ResetMax(double m) { maxLoan = m; }
void ResetRate(double r) { rate = r; }
void ResetOwes() { owesBank = 0; }
void Deposit(double amt);
double Balance() const;
friend Overdraft & operator=(Overdraft & ov, BankAccount & ba);
};
#endif
****** DEFINICE ČL. FUNKCÍ ******
#include<iostream>
using namespace std;
#include "mistrovstvi43b.h"
Overdraft::Overdraft(const char *s, long an, double bal,
double ml, double r) : Bank(s, an)
{
balance = bal;
maxLoan = ml;
owesBank = 0.0;
rate = r;
}
Overdraft::Overdraft(const Bank & ba, double ml, double r) : Bank(ba)
{
maxLoan = ml;
owesBank = 0.0;
rate = r;
}
void Overdraft::ViewAcct() const
{
ios_base::fmtflags initialState = cout.setf(ios_base::fixed, ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout.precision(2);
Bank::ViewAcct();
cout << "Maximalni vyse pujcky: $" << maxLoan << endl;
cout << "Dluzna castka: $" << owesBank <<endl;
cout << "Zustatek: $" << balance <<endl<<endl;
cout.setf(initialState);
}
void Overdraft::Withdraw(double amt)
{
ios_base::fmtflags initialState = cout.setf(ios_base::fixed, ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout.precision(2);
double bal = Balance();
if (amt <= bal + maxLoan - owesBank)
{
double advance = amt - bal;
owesBank += advance * (1.0 + rate);
cout << "Bankovni pujcka: $" << advance << endl;
cout << "Financni poplatek: $" << advance * rate << endl;
Deposit(advance);
}
else
cout<<"Kreditni limit prekrocen. Transakce stornovana.\n";
cout.setf(initialState);
}
void Overdraft::Deposit(double amt)
{
balance += amt;
}
double Overdraft::Balance() const
{
return balance;
}
Overdraft & operator=(Overdraft & ov, BankAccount & ba)
{
if(&ov == &ba)
return ba;
else
strcpy(ov.fullName, ba.fullName);
ov.acctNum = ba.acctNum;
ov.balance = ba.balance;
return ov;
}