mokrowski |
» 2016-12-13 18:55:34 Ok... z innej beczki trochę bo kręcisz się nieco w miejscu z tymi sklepami... Jeśli nie chcesz używać kontenerów dynamicznych które załatwiają temat automatycznej alokacji pamięci (np. vector), to zdecyduj się na arbitralnie określaną wielkość ilości elementów przetrzymywanych w klasie. Jeśli tak nie zrobisz to będziesz rozwiązywał X problemów które są _poboczne_ dla głównego zadania a jest nią zapoznanie się z klasami. Proponuję więc abyś tworzył Magazyn (czy Sklep) z tablicą wskaźników na obiekty Książki. Tablicę tę inicjuj nullptr lub NULL (w zależności od wersji języka C++ którym się posługujesz) w konstruktorze Magazyn/Sklep. Pamiętaj o poprawnej destrukcji tej tablicy w destruktorze klasy. Dodaj atrybut przechowujący indeks pierwszego wolnego "slotu" w tablicy (czyli gdzie jest nullptr). Jak będziesz oddawał książkę, za każdym razem uruchom metodę poszukiwania od początku tablicy do wystąpienia nullptr i uaktualnij atrybut "pierwszy_wolny_index_w_tablicy" (czy jak go tam nazwiesz). Przy szukaniu sprawdzaj czy nie wychodzisz poza tablicę. Alokacja dynamiczna _nie_jest_ problemem którym chcesz się teraz zajmować (uwierz, jak poznasz vector i inne kontenery nie będziesz "taplał się w błocie" :-/ ). To co zaproponowałem nie jest optymalne jeśli chodzi o "zasady sztuki" ale jeśli ma być z użyciem sznurka i taśmy klejącej, to nie oczekuj że będzie to "rakieta". Ważne: siły na zamiary a narzędzia do wymagań :-) Oto szkic.. #include <iostream> #include <cstdlib>
using namespace std;
class Ksiazka { public: Ksiazka( const char * tytul, double cena_netto ); ~Ksiazka(); const char * daj_tytul() const; double daj_cene_netto() const; };
class Sklep { public: Sklep(); ~Sklep(); bool dodaj_ksiazke( Ksiazka * ksiazka ); const Ksiazka * daj_ksiazke( const char * tytul ); private: bool ustaw_pierwszy_wolny(); size_t pierwszy_wolny; Ksiazka * ksiazki[ 3 ]; };
Sklep::Sklep() : pierwszy_wolny( 0 ) { for( size_t i = 0; i < 3; ++i ) { ksiazki[ i ] = NULL; } } Sklep::~Sklep() { for( size_t i = 0; i < 3; ++i ) { delete ksiazki[ i ]; } }
bool Sklep::dodaj_ksiazke( Ksiazka * ksiazka ) { if( ustaw_pierwszy_wolny() ) { ksiazki[ pierwszy_wolny ] = ksiazka; } else { cerr << "Uwaga: Sklep jest pełny!" << endl; return false; } return true; }
const Ksiazka * Sklep::daj_ksiazke( const char * tytul ) { Ksiazka * zwracana = ksiazki[ --pierwszy_wolny ]; ksiazki[ pierwszy_wolny + 1 ] = NULL; return zwracana; }
bool Sklep::ustaw_pierwszy_wolny() { ++pierwszy_wolny; return true; }
int main() { Ksiazka * k1 = new Ksiazka( "Alicja w krainie czarów", 12.3 ); Ksiazka * k2 = new Ksiazka( "C++ miłość romantyczna czy tragiczna?", 49.2 ); Ksiazka * k3 = new Ksiazka( "Nowoczesne synonimy głupoty - studium", 65.3 ); Sklep * s1 = new Sklep(); s1->dodaj_ksiazke( k1 ); s1->dodaj_ksiazke( k2 ); s1->dodaj_ksiazke( k3 ); delete s1; }
|
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-13 21:49:32 Ok, piszę, tylko chce się upewnić: 1. te funkcje służą do wypisania ceny i tytułu książki, na rzecz której są wywyoływane? const char * daj_tytul() const; double daj_cene_netto() const;
2. const Ksiazka * Sklep::daj_ksiazke( const char * tytul )
Ta funkcja "szuka" książki o którą nam chodzi (po tytule) i zwraca stały wskaźnik do tejże książki? 3. Po co ta funkcja jest bool? Nie lepiej void? bool Sklep::dodaj_ksiazke( Ksiazka * ksiazka ) { if( ustaw_pierwszy_wolny() ) { ksiazki[ pierwszy_wolny ] = ksiazka; } else { cerr << "Uwaga: Sklep jest pełny!" << endl; return false; } return true; }
|
|
mokrowski |
» 2016-12-13 21:57:11 1) Służą do pobrania tytułu i pobrania ceny. Jak chcesz to będziesz to wyświetlał ale same nie wyświetlają tych danych 2) Tak. 3) Nie nie lepiej bo jak się nie uda dodać książki, zwraca false (wyjątków przecież jeszcze nie znasz). To ustaw_pierwszy_wolny() będzie sygnalizowało że już jest koniec tablicy ale ona jest prywatna a Ty potrzebujesz sygnalizacji że książki już nie da się dodać bo nie ma miejsca (przypuśćmy) w magazynie :-)
|
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-13 22:13:07 "Służą do pobrania tytułu i pobrania ceny" - nie lepszy byłby konstruktor, który zresztą mamy? :p "Nie nie lepiej bo (...)" przecież wypisuje ( cerr << "Uwaga: Sklep jest pełny!" << endl;), że nie ma miejsca. Szczególnie, że nic z tym zwrotem nie robimy (żadnego if'a czy przypisania do zmiennej) Sorki, że Cię tak męczę, ale kto pyta nie błądzi ;) |
|
carlosmay |
» 2016-12-13 22:17:26 |
|
Gibas11 |
» 2016-12-13 22:17:53 "Służą do pobrania tytułu i pobrania ceny" - nie lepszy byłby konstruktor, który zresztą mamy? :p |
Nie takiego pobrania. Chodzi o coś takiego: auto tytul = jakasKsiazka.daj_tytul(); , potem ew. możesz sobie zrobić std::cout << tytul; jak będziesz chciał wypisać ten tytuł na ekran. Szczególnie, że nic z tym zwrotem nie robimy (żadnego if'a czy przypisania do zmiennej) |
To że nie ma go w zapodanym gotowcu nie znaczy że sam nie powinieneś tego zrobić. |
|
carlosmay |
» 2016-12-13 22:23:53 "Nie nie lepiej bo (...)" przecież wypisuje ( cerr << "Uwaga: Sklep jest pełny!" << endl;), że nie ma miejsca. |
Właśnie do tego służy wartość bool zwracana z funkcji. if( !jakasKsiazka.dodaj_ksiazke( & ksiazka ) { cout << "Pomysl co dalej, bo nie masz juz miejsca w magazynie."; } |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-13 22:46:43 @up bool Sklep::dodaj_ksiazke( Ksiazka * ksiazka ) { if( ustaw_pierwszy_wolny() ) { ksiazki[ pierwszy_wolny ] = ksiazka; } else { cerr << "Uwaga: Sklep jest pełny!" << endl; return false; } return true;
No dobra, już wszystko jasne, jutro dokończę pisanie. |
|
1 « 2 » 3 |