• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Projekt książki adresowej - struktura programu

VPS Starter Arubacloud
0 głosów
693 wizyt
pytanie zadane 24 listopada 2017 w C i C++ przez syzmon9 Początkujący (250 p.)

Cześć wszystkim!

Na początku chciałbym się przywitać bo mimo że śledzę to forum już od jakiegoś czasu to pytanie zadaję po raz pierwszy. 

Mam do napisania Książkę adresową w c++. Projekt ma być w pełni obiektowy a adresy mają być przechowywane w tablicy dynamicznej. Książka ma umożliwiać wyświetlanie, dodawanie, szukanie, usuwanie i edycję adresów oraz ma działać na pliku tekstowym (zapis/odczyt). 

Mój problem jest następujący. Stworzyłem klasę Record która zawiera dane pojedynczego wpisu do książki adresowaj. Jej składowe to imię, nazwisko, adres, kod pocztowy, miasto. Mam też klasę AdressBook, która składa się z tablicy obiektów klasy Record oraz liczby która definiuje długość tej tablicy. Moje pytanie jest następujące. W którym miejscu powinienem dodawać funkcjonalności całej książki adresowej? Czy funkcje takie jak dodawanie adresu mam tworzyć w klasie Record czy w klasie AdressBook

Czy byłby ktoś w stanie pomóc mi rozplanować kod dla takiego przypadku? Nie wiem dlaczego ale w programowaniu strukturalnym nie mam problemu z 'ułożeniem' sobie w głowie programu a w programowaniu obiektowym te problemy są ogromne - przeważnie gdy pojawiają się dwa lub więcej skorelowane ze sobą obiekty. 

komentarz 24 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

funkcjonalności całej książki adresowej

Słaby ze mnie projektant, ale moim zdaniem sam sobie odpowiedziałeś na to pytanie. wink

komentarz 24 listopada 2017 przez syzmon9 Początkujący (250 p.)

Tzn potrzebuję bardziej potwierdzenia czy dobrze myślę bo już sam nie jestem pewny. Czyli jak chcę stworzyć nowy wpis do książki to muszę utworzyć obiekt klasy Record i dodać go za pomocą metody w klasie AdressBook? Czyli w klasie Record oprócz odpowiednich właściwości wystarczy mi konstruktor do ustawiania wartości czy będę musiał dodawać tam jeszcze inne metody dla uzyskania określonych w pytaniu funkcji? Chodzi mi o rozdzielenie co powinna robić klasa AdressBook a co klasa Record. 

komentarz 25 listopada 2017 przez j23 Mędrzec (194,920 p.)

Sprawa jest tutaj oczywista. AdressBook zarządza rekordami, więc powinna odpowiadać za dodawania, usuwanie i udostępnianie zawartości. Record to struktura, która zawiera dane pojedynczego wpisu, i powinna odpowiadać tylko za te dane.

komentarz 25 listopada 2017 przez syzmon9 Początkujący (250 p.)

Ok. Czyli klasa Record  będzie zawierała tylko konstruktor który będzie tworzył obiekt z zadanymi przez użytkownika wartościami, a klasa PhoneBook zawierająca tablicę tych wpisów będzie obsługiwała wyświetlanie, dodawanie itp? Czy np nie muszę stworzyć jakiejś metody getRecord w klasie Record która będzie wyświetlała pojedynczy adres, żeby później można to było wyświetlać w tablicy obiektów w klasie PhoneBook

Czy tak to powinno wyglądać?

class Record
{
	string name, surname, street, houseNumber, postalCode, city;
public:
	Record(string, string, string, string, string, string);
	Record();
	~Record();
}

class PhoneBook
{
	int tableCap;
	Record *recordTable;
public:
	PhoneBook();
	void addRecord(const Record& newRecord);
	void showRecord(const PhoneBook& table);
	void deleteRecord();
	void searchRecord();
	bool readFromFile();
	bool saveToFile();
	friend std::ostream& operator<<(std::ostream&, const PhoneBook& t);
	~PhoneBook();
}

 

komentarz 25 listopada 2017 przez j23 Mędrzec (194,920 p.)
edycja 25 listopada 2017 przez j23

Czy tak to powinno wyglądać?

  • linia 5: parametry typu string przekazuj przez const referencję
  • linia 17: dlaczego showRecord przyjmuje w parametrze referencję na obiekt PhoneBook? Zresztą po co ta metoda w ogóle tam jest, jeśli tę samą funkcję będzie pełnić operator<<?
  • linia 18, 19, 20 i 21: parametrów chyba zabrakło. searchRecord powinna coś zwrócić.
  • dodałbym const Record& getRecord(size_t) const; i size_t getRecordCount() const;
  • operator<< dałbym dla Record i wywalił z PhoneBook.

Czy np nie muszę stworzyć jakiejś metody getRecord w klasie Record

getRecord w klasie Record? I co by miała zwrócić? this? Chyba że miałeś na myśli akcesory do prywatnych pól klasy, wtedy oczywiście tak.

komentarz 25 listopada 2017 przez syzmon9 Początkujący (250 p.)
  • linia 5: ok zrobię to przez referencje
  • linia 17: z tym miałem spory problem. Nie mogłem wyświetlać kolejnych rekordów tablicy bez przeciążenia operatora. I to jest właśnie skutek moich eksperymentów. Chciałem po kolei wyświetlać każdy wpis w tej tablicy recordTable. Czyli powinienem tam podawać jako parametr recordTable
  • linie 18-21: na razie rozpisałem funkcjonalność i nie ma w tych metodach kodu bo jeszcze nie myślałem nad implementacją ich. Ale tak, naturalnie - w miarę dodawania tych funkcji będą się tam pojawiać parametry. 

getRecord w klasie Record? I co by miała zwrócić? this? Chyba że miałeś na myśli akcesory do prywatnych pól klasy, wtedy oczywiście tak.

Myślałem nad tym żeby konstruktor klasy Record wymuszał wprowadzenie danych od użytkownika (np przez cin>>) i wpisywał te dane do kolejnych właściwości. Stąd też się zastanawiałem czy nie muszę tworzyć oddzielnej metody do wypisywania całego rekordu na ekran konsoli za pomocą cout ale zacząłem się zastanawiać czy nie mogę tego od razu robić w konstruktorze. Tutaj w zasadzie przy tym wyświetlaniu mam największy problem bo nie wiem jak to ugryźć frown

 

I wielkie dzięki za pomoc :)

komentarz 25 listopada 2017 przez j23 Mędrzec (194,920 p.)

Czyli powinienem tam podawać jako parametr recordTable

Zrób tak, jak pisałem - dodaj metody getRecord() i getRecordCount(). IMO bez sensu komplikujesz klasę. Po co ona ma cokolwiek wyświetlać? Wyświetlić możesz sobie gdzieś tam w kodzie aplikacji np. tak:

for(size_t i = 0; i < book.getRecordCount(); ++i)
      std::cout << book.getRecord(i) << '\n'; // przy przeciążonym << dla Record

 

Myślałem nad tym żeby konstruktor klasy Record wymuszał wprowadzenie danych od użytkownika (np przez cin>>)

Zło! Niech Cię opuszczą takie myśli...

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+1 głos
1 odpowiedź 195 wizyt
0 głosów
1 odpowiedź 326 wizyt
pytanie zadane 19 grudnia 2019 w Java przez Padoski Użytkownik (990 p.)
0 głosów
2 odpowiedzi 335 wizyt
pytanie zadane 10 października 2016 w C i C++ przez dudussss Nowicjusz (120 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...