Kolejka - const& w klasie

0

Dlaczego mi się jakieś zera wypisaują przy zdejmowaniu z kolejki

#include <iostream>
#include <stdexcept>
using namespace std;

template <typename T, int POJEMNOSC>
class Kolejka {
    T kolejka[POJEMNOSC];
    int ostatni;

public:
    Kolejka()
        : ostatni(-1){};
    void wloz(const T);
    T zdejmij();
};

template <typename T, int POJEMNOSC>
void Kolejka<T, POJEMNOSC>::wloz(const T value)
{
    if (ostatni < POJEMNOSC - 1) {
        kolejka[++ostatni] = value;
        cout << "dodalem(" << kolejka[ostatni] << ")\n";
    }
    else
        throw std::out_of_range("Za duza kolejka!");
}

template <typename T, int POJEMNOSC>
T Kolejka<T, POJEMNOSC>::zdejmij()
{
    if (ostatni >= 0) {
        int i = -1;
        cout << "usunolem(" << kolejka[0] << ")\n";
        while (++i < ostatni)
            kolejka[i] = kolejka[i + 1];
    }
    else
        throw std::out_of_range("Kolejka pusta!");
}

int main()
{
    cout << "Kolejka:(double)" << endl;
    Kolejka<double, 3> k;
	    k.wloz(2.4);
	    k.wloz(5.0);
	    k.wloz(1.5);
	    cout << k.zdejmij() << endl;
	    cout << k.zdejmij() << endl;
	    cout << k.zdejmij() << endl;
   
}

2 pytańko:
co to za dziwna definicja
void Stos<T,POJEMNOSC>::push(T const& value)
bo widziałem coś takiego ale nie rozumiem argumentu który ta funkcja przyjmuje, jeśli przekaże zmienną double to T=double
więc double const& value - więc nie rozumiem, tego co to znaczy
wywołanie:objekt_kolejka.push(2.4);

1

Ta twoja funkcja zdejmij co zwraca? I później co z tą wartością robisz?

"void Stos<T,POJEMNOSC>::push(T const& value)"

Ogólnie poczytaj sobie o dedukcji typów, w FAQ dałem link do efficient modern c++ rozdział 1 i 2. Ogólnie też nie wiem o co pytasz.
edit2:

0

pomoze ktoś bo nie działa poprawnie, a wyrzuca mi pusta kolejka


#include <iostream>
#include <stdexcept>
using namespace std;

template <typename T, int POJEMNOSC>
class Kolejka {
    T kolejka[POJEMNOSC];
    int ostatni;

public:
    Kolejka()
        : ostatni(-1){};
    void wloz(T const);
    void zdejmij();
};

template <typename T, int POJEMNOSC>
void Kolejka<T, POJEMNOSC>::wloz(T const value)
{
    if (ostatni < POJEMNOSC - 1) {
        kolejka[++ostatni] = value;
        cout << "dodalem(" << kolejka[ostatni] << ")\n";
    }
    else
        throw std::out_of_range("Za duza kolejka!");
}

template <typename T, int POJEMNOSC>
void Kolejka<T, POJEMNOSC>::zdejmij()
{
    if (ostatni > 0) {
        int i = -1;
        cout << "usunolem(" << kolejka[0] << ")\n";
        while (++i < ostatni) {
            kolejka[i] = kolejka[i + 1];
            --ostatni;
        }
    }
    if (ostatni == 0)
        ostatni = -1;
    else
        throw std::out_of_range("Kolejka pusta!");
}

int main()
{
    cout << "Kolejka:(double)" << endl;
    Kolejka<double, 3> k;
    Kolejka<int, 5> k2;
    k2.wloz(2);
    k2.wloz(5);
    k2.wloz(1);
    k2.zdejmij();
    cout << endl;
    k2.zdejmij();
    cout << endl;
    k2.zdejmij();
    cout << endl;
}

0
bartek164 napisał(a):

pomoze ktoś bo nie działa poprawnie, a wyrzuca mi pusta kolejka


#include <iostream>
#include <stdexcept>
using namespace std;

template <typename T, int POJEMNOSC>
class Kolejka {
    T kolejka[POJEMNOSC];
    int ostatni;

public:
    Kolejka()
        : ostatni(-1){};
    void wloz(T const);
    void zdejmij();
};

template <typename T, int POJEMNOSC>
void Kolejka<T, POJEMNOSC>::wloz(T const value)
{
    if (ostatni < POJEMNOSC - 1) {
        kolejka[++ostatni] = value;
        cout << "dodalem(" << kolejka[ostatni] << ")\n";
    }
    else
        throw std::out_of_range("Za duza kolejka!");
}

template <typename T, int POJEMNOSC>
void Kolejka<T, POJEMNOSC>::zdejmij()
{
    if (ostatni > 0) {
        int i = -1;
        cout << "usunolem(" << kolejka[0] << ")\n";
        while (++i < ostatni) {
            kolejka[i] = kolejka[i + 1];
            --ostatni;
        }
    }
    if (ostatni == 0)
        ostatni = -1;
    else
        throw std::out_of_range("Kolejka pusta!");
}

int main()
{
    cout << "Kolejka:(double)" << endl;
    Kolejka<double, 3> k;
    Kolejka<int, 5> k2;
    k2.wloz(2);
    k2.wloz(5);
    k2.wloz(1);
    k2.zdejmij();
    cout << endl;
    k2.zdejmij();
    cout << endl;
    k2.zdejmij();
    cout << endl;
}

Gdzie bloki try catch? Zainstaluj debbuger(a pewnie już masz jak używasz qt creator czy vs albo wielu innych ide) i śledź.

0

Przedziwna ta Twoja implementacja, stos typu <Typ, pojemność> ? Nie lepiej to uprościć, rozmiar stosu wrzucić do konstruktora i stworzyć klasyczny generic? Tu Masz podstawowy kod:

template <typename T>
class FixedCapacityStack{
	private:
	 T *  arr;
	 int N; //capacity
	
	public:
	FixedCapacityStack(int cap){
		arr = new T[cap];	 
		}
		
	
	void push(T elem){
		arr[N++] = elem;}

	T pop () {
		return arr[--N];}
	
	int size(){
		return N;}
	
	bool is_empty () {
		return N == 0;}
	};

Do tego jeszcze jakieś toString sobie Dopisz i Masz generic stack.

0

dobrze, już zrobiłem thx

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