Problem z funkcją tworzącą rachunek bankowy

0

Mam kilka klas:

 class Address {
private:
	string street;
	string postalCode;
	string town;
public:
	Address();
	~Address();
	Address(string street, string postalCode, string town);
	void setStreet(string street);
	string getStreet();
	void setPostalCode(string postalCode);
	string getPostalCode();
	void setTown(string town);
	string getTown();
};
 class Client {
private:
	string name;
	string surname;
	int age;
	int pesel;
	Address address;
public:
	Client();
	~Client();
	Client(string name, string surname, int age, int pesel, Address address);
	void setName(string name);
	string getName();
	void setSurname(string surname);
	string getSurname();
	void setAge(int age);
	int getAge();
	void setPesel(int pesel);
	int getPesel();
	Address getAddress();
	void getInfo();
};
 class Bank{
private:
	string name;
	Address address;
	int phone;
public:
	Bank();
	Bank(string name, Address address, int phone);
	~Bank();
	Bank(string name, int phone);
	void setName(string name);
	string getName();
	Address getAddress();
	void setPhone(int phone);
	int getPhone();
};
 class Account : public Bank{
private:
	int number;
	Client owner;
	float balance;
	string bankName;
	int bankRate;
	string currency;
	string openDate;
	string closeDate;
	double charge;
	char card;
public:
	Account();
	~Account();
	Account(int number, Client owner, string bankName, string openDate);
	void setNumber(int number);
	int getNumber();
	void setBalance(float balance);
	void deposit();
	void withdraw();
	float getBalance();
	void setOwner(Client owner);
	Client getOwner();
	void setBankName(string bankName);
	string getBankName();
	void setBankRate(int bankRate);
	int getBankRate();
	void setCurrency(string currency);
	string getCurrency();
	void setOpenDate(string openDate);
	string getOpenDate();
	void setCloseDate(string closeDate);
	string getCloseDate();
	void setCharge(double charge);
	double getCharge();
	void setCard(char card);
	char getCard();
	void createAccount();
	void transferIn();
	void transferOut();
	void closeAccout();
};

Klasa Account dziedziczy z klasy Bank(Odzial bankowy). W klasie Account mam jako zmienną obiekt klasy Client a Client posiada jako zmienną obiekt klasy Address.

W jaki sposób napisać funkcję tworzącą konto bankowe, jak zapisac dane klienta w obiekcie Client?

 void Account::createAccount()
{
	cout << "Podaj imie: ";
	cin >> name;
	cout << "Podaj numer konta: ";
	cin >> number;
	cout << "Podaj nazwe banku: ";
	cin >> bankName;
	cout << "Podaj date otwarcia rachunku: ";
	cin >> openDate;
}
0

Nie jest potrzebne dziedziczenie po klasie bank. Można zostawić samą klasę Account. Każdy obiekt Account przypisywać danemu klientowi i bankowi. Tak by móc sprawdzić ile i gdzie dany klient ma rachunków i ile kont/klientów jest w danym banku.

0

Tak bylo w poleceniu. Tresc w zalaczniku.

2

te settegry gettery to robia jedynie ze to pole staje sie publiczne :/

Bez sensu takie settery i gettery (tak wiem, ze jest tak w poleceniu mimo to nadal jest to bezsensu)

W jaki sposób napisać funkcję tworzącą konto bankowe, jak zapisac dane klienta w obiekcie Client?

zrob sobie AccountFactory i w nim tworz konto, niech przyjmuje klienta. Z klienta niech wezmie imie. Nazwa banku i numer rachunkowego niech bedzie zalezne od tego w jakim banku bedziemy tworzyc (parametr przeslany do fabryki). Zamiast podawac date otwarcia niech bierze dzisiejsza date. Uzyj do tego std::chrono::system_clock::now(). Niech ta funkcja rowniez przypisuje klienta jako ownera

1

Ja bym to zrobił w ten sposób (zrobiłem tylko ustawianie imienia):
Musisz ustawić ciała konstruktorów i destruktorów, setName i setOwner np tak:

class Client {
public:
	Client(){};
	~Client() {	};
	void setName(string name) {this->name = name;};
}
class Account: public Bank {
public:
	Account() {};
	~Account() {};
	void setOwner(Client owner){this->owner=owner;
}

Account::createAccount wyglądało by tak:

void Account::createAccount() {

	string name;
	cout << "Podaj imie: ";
	cin >> name;
	Client owner;
	owner.setName(name);
	this.setOwner(owner);

}
int main() {
	Account account;
	account.createAccount();
}

Proponuję Ci, żebyś na początek abyś nie pisał wszystkich metod dla wszystkich klas od razu, tylko zrób sobie na początek przykładowo w klasie Client tylko setClient i getClient w klasie Account setOwner i get Owner a następnie spróbuj sobie ustawić imię dla klienta i wyświetl je, jak Ci się uda skompilować i będzie działało to dopisz sobie pozostałe funkcjonalności.
Chodzi o to aby pisać małymi kroczkami łatwiej wykryć błędy.

Tak przy okazji tu masz http://ideone.com/FgOLej twój kod zapisujący imię i wyświetlający imię, pisałem tak na szybko i można by się do paru rzeczy jeszcze przyczepić, ale na początek powinno ci wyjaśnić sprawę.

0

Dzięki wielkie za pomoc :) troszkę mi rozjaśniłeś :) a teraz następny problem, bo mogę te obiekty zapisać w pliku lub w tablicy aby istniały na czas trwania programu. W jaki sposób zapisać te obiekty?

0

Chyba najprościej fopen, fwrite i fread.
Jeżeli chcesz zachować czytelność pliku to mozesz użyć http://www.cplusplus.com/doc/tutorial/files/

1
rudinho napisał(a):

Dzięki wielkie za pomoc :) troszkę mi rozjaśniłeś :) a teraz następny problem, bo mogę te obiekty zapisać w pliku lub w tablicy aby istniały na czas trwania programu. W jaki sposób zapisać te obiekty?

Rozumiem, że chodzi ci, żeby dane nie znikały po zakończeniu działania programu?
Bo tak jak ci napisałem w poprzednim poście dane będą odłożone w pamięci RAM na stosie i dopóki będzie istniała funkcja main dane będą dostępne(czyli na czas działania programu).

Możesz zapisać je do pliku (w poprzednim poście kolega podał link do tutoriala do obsługi plików), myślę, że najlepiej jest wtedy zrobić podział na pliki (adresy, właściciele itd). Możesz np utworzyć plik owners.txt (rozszerzenie nie ma tu znaczenia), a w nim zapisywać dane w ten sposób:
plik owners:

 name, surname, id_address

plik addres:

 id_address, country, city, street

Ale zauważ, że wychodzi relacyjna baza danych, dlatego ja bym wykorzystał tu po prostu bazę danych np. MySQL (ma to też tą zaletę, że sposób zapisu danych i odczytu jest standardowy(przy zapisywaniu do plików sam sobie tworzysz standard, ja np poszczególne pola oddzielałem przecinkiem). Dzięki temu możesz później taką bazę danych łatwo wykorzystać (albo udostępnić ją innemu programiście) do napisania np strony w PHP czy w Javie, albo do jakiegoś innego programu.
Obiektu jako całości nie da się zapisać. Do pliku możesz zapisywać np tak:

 // basic file operations
#include <iostream>
#include <fstream>
using namespace std;

int main () {
  ofstream myfile;
  myfile.open ("name.txt");
  myfile << account.getOwner().getName()+", "+account.getOwner().getSurname();
  myfile.close();
  return 0;
}

Podobnie będzie z bazą danych. Muszisz używać getów do pobrania danego pola z obiektu i zapisać go do pliku/bazy danych.
Tak samo będzie jak będziesz chciał wczytać dane z pliku/bazy to wczytujesz i ustawiasz obiekt za pomocą seterów.

0

Dzięki za odpowiedź, stworzyłem już funkcję która tworzy mi klienta, konto i zapisuje dane do pliku.

 void Account::createAccount()
{
	string name, surname, street, postalCode, town, openDate;
	int age, pesel;
	cout << "\n\tPodaj imie: ";
	cin >> name;
	cout << "\tPodaj nazwisko: ";
	cin >> surname;
	cout << "\tPodaj ulice: ";
	cin >> street;
	cout << "\tPodaj kod pocztowy: ";
	cin >> postalCode;
	cout << "\tPodaj miasto: ";
	cin >> town;
	cout << "\tPodaj wiek: ";
	cin >> age;
	cout << "\tPodaj pesel: ";
	cin >> pesel;
	cout << "\tPodaj numer konta: ";
	cin >> number;
	this->setNumber(number);
	cout << "\tPodaj dzisiejsza date w formacie DD/MM/RRRR: ";
	cin >> openDate;
	this->setOpenDate(openDate);
	Client owner;
	Address address;
	address.setStreet(street);
	address.setPostalCode(postalCode);
	address.setTown(town);
	owner.setName(name);
	owner.setSurname(surname);
	owner.setAge(age);
	owner.setPesel(pesel);
	owner.setAddress(address);
	this->setOwner(owner);
	system("cls");
	cout << "\n\tKonto zostalo utworzone...";
	cout << "\n\n\tDane klienta:";
	cout << "\n\tImie: " << this->getOwner().getName();
	cout << "\n\tNazwisko: " << this->getOwner().getSurname();
	cout << "\n\tWiek: " << this->getOwner().getAge();
	cout << "\n\tPesel: " << this->getOwner().getPesel();
	cout << "\n\tUlica: " << this->getOwner().getAddress().getStreet();
	cout << "\n\tKod pocztowy i miejscowosc: " << this->getOwner().getAddress().getPostalCode() << " " << this->getOwner().getAddress().getTown();
	cout << "\n\n\tDane rachunku:";
	cout << "\n\tNazwa banku: " << this->getBankName();
	cout << "\n\tNumer konta: " << this->getNumber();
	cout << "\n\tDostepne srodki: " << this->getBalance() << " zl";
	cout << "\n\tOprocentowaniea: " << this->getBankRate() << "%";
	cout << "\n\tWaluta: " << this->getCurrency();
	cout << "\n\tData otwarcia: " << this->getOpenDate();
	cout << "\n\tNumer konta: " << this->getNumber();
	cout << "\n\tOplata: " << this->getCharge() << " zl";
	cout << "\n\tKarta do rachunku (T-TAK, N-NIE): " << this->getCard();
	cout << "\n\n\tWcisnij ENTER aby przejsc do MENU";
}

w main po wybraniu opcji tworzenia konta wywoluje metode i zapisuje dane do pliku:

 Account account;
	account.createAccount();
	ofstream myfile1;
	myfile1.open("dane.txt", ofstream::app);
	myfile1 << account.getOwner().getName() + ", " + account.getOwner().getSurname() + ", " + to_string(account.getOwner().getAge()) + ", " + to_string(account.getOwner().getPesel()) + ", " + account.getOwner().getAddress().getStreet() + ", " + account.getOwner().getAddress().getPostalCode() + ", " + account.getOwner().getAddress().getTown() + ", " + to_string(account.getNumber()) + ", " + to_string(account.getBalance()) + ", " + account.getBankName() + ", " + to_string(account.getBankRate()) + ", " + account.getCurrency() + ", " + account.getOpenDate() + ", " + account.getCloseDate() + ", " + to_string(account.getCharge()) + ", " + account.getCard() + "\n";
	myfile1.close();

plik dane.txt wygląda następująco:

Jan, Kowalski, 29, 8803, Dluga, 80-704, Gdansk, 32, 0.000000, PG Bank, 0, PLN, 12/03/2016, -, 2.500000, T
Jakub, Kowalski, 32, 8503, Miedziana, 12-232, Warszawa, 3, 0.000000, PG Bank, 0, PLN, 12/04/2016, -, 2.500000, T

Teraz próbuje stworzyć metodę przelew ale nie wiem jak pobrać obiekt z pliku z którego będę wywoływał metodę transferOut(int number). Proszę o pomoc

1

Musisz wczytać do zmiennej linijkę pliku dane.txt (zakładając,że każdy wpis zakończony jest końcem linii).
Następnie tą zmienną musisz "pociąć" wykorzystując znak "," i pamiętając, że pierwszy ciąg znaków, do "," to imię, drugi, to nazwisko itd zapisujesz do obiektu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1