Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Szybkie konstruowanie obiektów będących składnikami klasy

Ostatnio zmodyfikowano 2016-12-14 18:09
Autor Wiadomość
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.. 
C/C++
#include <iostream>
#include <cstdlib>

// Uwaga: To szkic.. sam zajmij się doprowadzeniem do działania...

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:
    // Zwraca false jeśli się nie udało
    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 ) {
    // Tu algorytm szukania po tytule.
    // Użyć w obiekcie klasy Ksiązka, metody daj_tytul()
    // Na razie nawiny i _nieprawidłowy_!!!
    Ksiazka * zwracana = ksiazki[ --pierwszy_wolny ];
    ksiazki[ pierwszy_wolny + 1 ] = NULL;
    return zwracana;
}

bool Sklep::ustaw_pierwszy_wolny() {
    // Tu algorytm szukania pierwszego miejsca w ksiazki[] z NULL
    // Jak znajdzie, ustawia pierwszy_wolny w klasie.
    // Na razie naiwne i nieprawidłowe!!!
    ++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 );
    // Destrukcją książek zajmie się sklep.
    delete s1;
}
P-154867
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?
C/C++
const char * daj_tytul() const;
double daj_cene_netto() const;

2.
C/C++
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?
C/C++
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;
}
P-154879
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 :-)
P-154881
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 ;)
P-154882
carlosmay
» 2016-12-13 22:17:26
» KursyKurs STC kurs
» Kurs STC » PodstawyWstawianie cytatów lekcja
P-154883
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ć.
P-154884
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.
C/C++
if( !jakasKsiazka.dodaj_ksiazke( & ksiazka )
{
    cout << "Pomysl co dalej, bo nie masz juz miejsca w magazynie.";
}
P-154885
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-12-13 22:46:43
@up
C/C++
bool Sklep::dodaj_ksiazke( Ksiazka * ksiazka ) {
    if( ustaw_pierwszy_wolny() ) {
        ksiazki[ pierwszy_wolny ] = ksiazka;
    } else {
        cerr << "Uwaga: Sklep jest pełny!" << endl; //o tu tu tu jest
        return false;
    }
    return true;

No dobra, już wszystko jasne, jutro dokończę pisanie.
P-154886
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona