Nie działa funkcja wyświetlająca stos

0

Witam, poniżej mój kod. Czy podpowie mi ktoś dlaczego nie działa funkcja pokazstos()?Wyskakuje mi taki błąd: error: no matching function for call to 'std::stack<ksiazka>::top(ksiazka&)* poniżej jest zaznaczone do której linii się odnosi bład.

#include <iostream>
#include <string>
#include <stack>
#include <fstream>
using namespace std;

class ksiazka{
    public:
string nazwa, autor, wydawnictwo;
int cena, rok_wyd;
};

void dodaj(ksiazka &x){
cout<<"Podaj tytuł książki:"; cin>>x.nazwa;
cout<<"Podaj autora:";cin>>x.autor;
cout<<"Podaj wydawnictwo:";cin>>x.wydawnictwo;
cout<<"Podaj rok wydania książki:";cin>>x.rok_wyd;
cout<<"Podaj cenę:";cin>>x.cena;
}

void pokaz(ksiazka x){
cout<<"\n "<<x.nazwa<<"\n "<<x.autor<<"\n "<<x.rok_wyd<<"\n "<<x.wydawnictwo<<"\n "<<x.cena;
}
stack<ksiazka>biblioteka;
void push(const ksiazka &x){};
void pop(ksiazka &x){};

void zapiszdopliku(const ksiazka& x){

ofstream plik;
 plik.open("dane.txt", ios::app);
    cout<<"\nzapisywanie do pliku...";
     plik<<x.nazwa;
     plik<<x.autor;
     plik<<x.wydawnictwo;
     plik<<x.cena;
     plik<<x.rok_wyd;
    plik.close();
}

void odczytajzpliku(ksiazka x){
    fstream plik;
    plik.open("dane.txt", ios::in);
    plik>>x.nazwa;
    plik>>x.autor;
    plik>>x.wydawnictwo;
    plik>>x.rok_wyd;
    plik>>x.cena;
    biblioteka.push(x);
}
void dodajnastos(){
ksiazka x;
dodaj(x);
biblioteka.push(x);
}

void pokazstos(){
    ksiazka *x;
while(!biblioteka.empty()){
    cout<<" "<<biblioteka.top(x); //  <----tu wyskakuje błąd
    biblioteka.pop();
}cout<<"\n";

}

int main()
{
    ofstream plik;
    ksiazka x;

    //push(x);
    odczytajzpliku(x);
    dodajnastos();
    zapiszdopliku(x);
    //pokaz(x);
    pokazstos();
    return 0;
}
2

po co ten x?
Naprawione w sposób naiwny:
https://wandbox.org/permlink/KBPUzbCn8Airbgro

1

Tworzysz w funkcji pokazstos nową zmienną x, będącą wskaźnikiem na książka, po czym próbujesz na tej niezainicjalizowanej zmiennej pracować.

2

.top() nie przyjmuje żadnych parametrów, a ty przekazujesz wskaźnik którego i tak nie inicjujesz. Z tego co na szybko patrzę to powinno być tak: pokaz(biblioteka.top());

Oprócz to kilka rzeczy jest tu bez sensu.

  1. unikaj zmiennych globalnych. Zadeklaruj je w funkcji i przekazuj je jako parametry.
  2. funkcja pokazstos() usuwa ci elementy ze stosu, co też nie powinno mieć miejsca, w funkcji która ma go wyświetlać.
1

Zamiast couta powinnaś użyć @mamba funkcji:

pokaz(biblioteka.top())

aby szybko naprawić błąd kompilacji.
Jednak właściwym rozwiązaniem będzie tutaj stworzenie iteratora pokazującego na początek stosu, i następnie jego iterację póki nie wskaże on na koniec stosu, wywołując z każdym przejściem pętli pokaz(*iterator);

0
MasterBLB napisał(a):

Zamiast couta powinnaś użyć @mamba funkcji:

pokaz(biblioteka.top())

aby szybko naprawić błąd kompilacji.
Jednak właściwym rozwiązaniem będzie tutaj stworzenie iteratora pokazującego na początek stosu, i następnie jego iterację póki nie wskaże on na koniec stosu, wywołując z każdym przejściem pętli pokaz(*iterator);

A jak zrobić iterator wskazujący na początek stosu?

Althorion napisał(a):

Tworzysz w funkcji pokazstos nową zmienną x, będącą wskaźnikiem na książka, po czym próbujesz na tej niezainicjalizowanej zmiennej pracować.

Co powinnam zmienić w funkcji dodajnastos() ?

Bartek P napisał(a):

.top() nie przyjmuje żadnych parametrów, a ty przekazujesz wskaźnik którego i tak nie inicjujesz. Z tego co na szybko patrzę to powinno być tak: pokaz(biblioteka.top());

Oprócz to kilka rzeczy jest tu bez sensu.

  1. unikaj zmiennych globalnych. Zadeklaruj je w funkcji i przekazuj je jako parametry.
  2. funkcja pokazstos() usuwa ci elementy ze stosu, co też nie powinno mieć miejsca, w funkcji która ma go wyświetlać.

A jak w takim razie powinna wyglądać funkcja pokazstos() żeby nie usuwała elementów, tylko je wyświetlała?

0
mamba napisał(a):

A jak zrobić iterator wskazujący na początek stosu?

Hmm z przyzwyczajenia napisałem, bo znakomita większość klas pojemnikowych iteratory posiada - ale stos nie jak się okazuje.
To ok, odwoływanie się do stos.top() i stos.pop() jest właściwą drogą aby tego std::stack używać.
Powstaje jednak pytanie, czy do Twoich zastosowań to stos jest aby na pewno odpowiedni.
Siostro @mamba, na pewno musisz na stosie operować?

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