Nie działająca kolejka napisana obiektowo (class)

0

Cześć, raczkuje dopiero w c++ a tym bardziej w metodzie klas i chciałbym was się spytać, dlaczego mój program się nie kompiluje i nie widzi voidow.

main.cpp

#include <iostream>
#include <windows.h>
#include <conio.h>
#include "klasy.h"
using namespace std;

int main()
{
 int wybor;
    int ile=0;
    int glowa=0;
    int ogon=0;


    do
    {

        wyswietl_kolejke();

        cout<<"glowa="<<glowa<<"   ogon="<<ogon<<"   ile="<<ile<<endl<<endl;

        cout << "MENU GLOWNE KOLEJKI:"<<endl;
        cout << "------------------------------------------"<<endl;
        cout << "1. PUSH (dodaje element na koniec kolejki) "<<endl;
        cout << "2. POP (usuwa element z poczatku kolejki) "<<endl;
        cout << "3. SIZE (ile elementow w kolejce) "<<endl;
        cout << "4. EMPTY (czy kolejka jest pusta?) "<<endl;
        cout << "5. Koniec programu "<<endl;
        cout << "------------------------------------------"<<endl;
        cout << "Wybor: ";
        cin >> wybor;

        switch (wybor)
        {
        case 1:
            push();
            break;

        case 2:
            pop();
            break;

        case 3:
            size();
            break;

        case 4:
            empty();
            break;
        }

    }
    while (wybor != 5);

Stos;

    return 0;
}

klasy.h

#include <iostream>
#include <windows.h>
using namespace std;

class Stos
{
    public:
    int dane[5];
    int ile;
    int glowa;
    int ogon;



void wyswietl_kolejke()
{
    system("CLS");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),14);

    cout<<endl;
    cout<<"-------------------"<<endl;
    cout<<"ZAWARTOSC KOLEJKI: "<<endl;
    cout<<"-------------------"<<endl;


    if (ile==0)
    {
        cout<<"pusta";
    }

    else
    {

        int indeks;

        for (int i=0; i<ile; i++)
        {
            indeks=glowa+i;
            if (glowa+i>=5) indeks=glowa+i-5;
            cout<<dane[indeks]<<" ";
        }

    }

    cout<<endl<<"-------------------"<<endl<<endl;


    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
};

//------------------------------------------------------------------------

void push()
{
    if (ile>=5)
    {
        cout << "Kolejka pelna!";
        Sleep(1000);
    }
    else
    {
        cout<<endl<< "PUSH (jaka liczbe wstawic do kolejki): ";
        cin>>dane[ogon];
        ogon=(ogon+1)%5;
        ile=ile+1;
    }
}

//------------------------------------------------------------------------

void pop()
{
    if (ile==0)
    {
        cout<<"Kolejka jest pusta!";
        Sleep(1000);
    }
    else
    {
        cout<<endl<<"POP - nastapi usuniecie z kolejki liczby: "<<dane[glowa];
        glowa=(glowa+1)%5;
        ile=ile-1;
		Sleep(1000);

    }


}
//------------------------------------------------------------------------

void size()
{
    cout<<endl<<"Liczba elementow w kolejce: "<<ile;
    Sleep(1000);
}

//------------------------------------------------------------------------

void empty()
{

    if (ile==0) cout<<endl<<"EMPTY (kolejka pusta?) ->  TRUE";
    else cout<<endl<<"EMPTY (kolejka pusta?) ->  FALSE";
    Sleep(1000);
}

};

1

Co to znaczy nie widzi voidow?

2

@Maksymilian Rękawek: Zdefiniowałeś klasę Stos z kilkoma metodami, ale w kodzie jej nie używasz.
Nie widzi voidow, bo są one niestatycznymi częściami klasy i muszą być wywoływane na rzecz instancji tej klasy.

int main()
{
  Stos s;
  s.push();
  s.size();
}
3

To jest napisane obiektowo??? Jestem zdumiony.

1

To wygląda, jakbyś posiadał kod strukturalny z globalnymi zmiennymi i poddał go przeróbce. Przeróbce polegającej na zamknięciu kilku procedur w klasie i przeniesieniu tej klasy do oddzielnego pliku.
Przy takim podejściu szybko dojdziesz do "C z klasami" i zatrzymasz się na tym. Programowanie obiektowe, mimo wszystko, wymaga zmiany myślenia i pójście na skróty nie przyspieszy zrozumienia go.
Zacznij może od prostszych przypadków: jeden plik, klasa z jedną metodą wyświetlająca jakiś napis, main w którym zadeklarujesz obiekt tej klasy i go użyjesz. Potem powoli dodawaj kolejne elementy: zmienne w klasie, inne metody, podział na pliki.
Naprawdę, w tym wypadku postaraj się zrozumieć a nie pędzić do przodu.

2

Musisz stworzyć instancje klasy Stos

Stos stos;
stos.wyswietl_kolejke(); // wywolanie metody na rzecz obiektu stos

Stos powinien być strukturą danych, która tylko pracuje na danych. Pobieranie wartości od użytkownika jak i wyświetlanie
komunikatów powinno być wydzielone. Przykładowo metoda push() powinna przyjmować w parametrze wartość, którą ma wrzucić
na stos a nie wczytywać ze strumienia wejścia.

0
lookacode1 napisał(a):

Musisz stworzyć instancje klasy Stos

Stos stos;
stos.wyswietl_kolejke(); // wywolanie metody na rzecz obiektu stos

Stos powinien być strukturą danych, która tylko pracuje na danych. Pobieranie wartości od użytkownika jak i wyświetlanie
komunikatów powinno być wydzielone. Przykładowo metoda push() powinna przyjmować w parametrze wartość, którą ma wrzucić
na stos a nie wczytywać ze strumienia wejścia.

ogólnie zrobiłem coś takiego na ten moment:

klasa.h

#include <iostream>
#include <windows.h>
using namespace std;

class kolejka
{
    public:
    int dane[5];
    int ile;
    int glowa;
    int ogon;

void wyswietl_kolejke()
{
    system("CLS");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),14);

    cout<<endl;
    cout<<"-------------------"<<endl;
    cout<<"ZAWARTOSC KOLEJKI: "<<endl;
    cout<<"-------------------"<<endl;

    if (ile==0)
    {
        cout<<"pusta";
    }

    else
    {

        int indeks;

        for (int i=0; i<ile; i++)
        {
            indeks=glowa+i;
            if (glowa+i>=5) indeks=glowa+i-5;
            cout<<dane[indeks]<<" ";
        }

    }

    cout<<endl<<"-------------------"<<endl<<endl;

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
};

//------------------------------------------------------------------------

void push()
{
    if (ile>=5)
    {
        cout << "Kolejka pelna!";
        Sleep(1000);
    }
    else
    {
        cout<<endl<< "PUSH (jaka liczbe wstawic do kolejki): ";
        cin>>dane[ogon];
        ogon=(ogon+1)%5;
        ile=ile+1;
    }
}

//------------------------------------------------------------------------

void pop()
{
    if (ile==0)
    {
        cout<<"Kolejka jest pusta!";
        Sleep(1000);
    }
    else
    {
        cout<<endl<<"POP - nastapi usuniecie z kolejki liczby: "<<dane[glowa];
        glowa=(glowa+1)%5;
        ile=ile-1;
        Sleep(1000);

    }

}
//------------------------------------------------------------------------

void size()
{
    cout<<endl<<"Liczba elementow w kolejce: "<<ile;
    Sleep(1000);
}

//------------------------------------------------------------------------

void empty()
{

    if (ile==0) cout<<endl<<"EMPTY (kolejka pusta?) ->  TRUE";
    else cout<<endl<<"EMPTY (kolejka pusta?) ->  FALSE";
    Sleep(1000);
}

void meni()
{

 int wybor;
    int ile=0;
    int glowa=0;
    int ogon=0;

for( ; ; )
{

      cout<<"glowa="<<glowa<<"   ogon="<<ogon<<"   ile="<<ile<<endl<<endl;

        cout << "MENU GLOWNE KOLEJKI:"<<endl;
        cout << "------------------------------------------"<<endl;
        cout << "1. PUSH (dodaje element na koniec kolejki) "<<endl;
        cout << "2. POP (usuwa element z poczatku kolejki) "<<endl;
        cout << "3. SIZE (ile elementow w kolejce) "<<endl;
        cout << "4. EMPTY (czy kolejka jest pusta?) "<<endl;
        cout << "5. Koniec programu "<<endl;
        cout << "------------------------------------------"<<endl;
        cout << "Wybor: ";
        cin >> wybor;

        switch (wybor)
        {
        case 1:
            push();
            break;

        case 2:
            pop();
            break;

        case 3:
            size();
            break;

        case 4:
            empty();
            break;

        }


}
}
};

main.cpp

#include <iostream>
#include <windows.h>
#include <conio.h>
#include "klasy.h"
using namespace std;

int main()
{

    kolejka k;
    k.meni();

    return 0;
}

Ale na start pryzmuje, że w kolejce jest 55 elementów, a nie 0 i kompletnie nie wiem gdzie on te dane uzupełnia

0

Tablice masz 5 elementowa na dane, żeby było 55 musisz zmienić rozmiar int dane[55]. W metodzie push() masz uzupełnianie danych przez
wczytywanie od użytkownika ale jak już wspomniałem jest to słabe rozwiązanie.

0
lookacode1 napisał(a):

Tablice masz 5 elementowa na dane, żeby było 55 musisz zmienić rozmiar int dane[55]. W metodzie push() masz uzupełnianie danych przez
wczytywanie od użytkownika ale jak już wspomniałem jest to słabe rozwiązanie.

Mam 5 a jak program staruje to wygląda to tak, takze sam dziwnie się jak statyczna struktura jaką jest tablica trzyma 55 liczb:
title

0
Maksymilian Rękawek napisał(a):

Ale na start pryzmuje, że w kolejce jest 55 elementów, a nie 0 i kompletnie nie wiem gdzie on te dane uzupełnia

Nie inicjujesz zmiennych i dlatego masz tam losowe wartości. Albo ustaw wartości domyślne bezpośrednio w nagłówku, albo dodaj konstruktor
Radzę przeczytać jakiś kurs, bo nie łapiesz nie tyle OOP, co samej idei klas.

0

Zainicjuj zmienne w konstruktorze:

class kolejka {
public:
    int dane[5];
    int ile;
    int glowa;
    int ogon;

    kolejka(): dane{0} {
         ile = 0;
         glowa = 0;
         ogon = 0;
    }
   // ...
};
0
lookacode1 napisał(a):

Zainicjuj zmienne w konstruktorze:

class kolejka {
public:
    int dane[5];
    int ile;
    int glowa;
    int ogon;

    kolejka(): dane{0} {
         ile = 0;
         glowa = 0;
         ogon = 0;
    }
   // ...
};

Ok a jeśli dane są prywatne

    private:
    int dane[5];
    int ile;
    int glowa;
    int ogon;

    public:
        int wyb;

to jak wtedy zrobić, aby program startował z pusta kolejka

0
Maksymilian Rękawek napisał(a):

to jak wtedy zrobić, aby program startował z pusta kolejka

Zainicjalizować stan początkowy

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