CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Problem z zapisem danych z klasy w tablicy
Strona 1 z 2

Problem z zapisem danych z klasy w tablicy

Nowy postNapisane: czwartek, 30 kwietnia 2015, 15:33
przez nvdante
Witam serdecznie!

Piszę prosty programik pobierający od usera zamówienia i zapisujący je w tablicy na początek.
Problem polega na tym, że mogę wywołać w pętli metodę zapisz_dane(), ale nie mogę jej wyników wrzucić do tablicy.
Wygląda na to, że przeszkadza w tym typ void metody zapisz_dane(). Wydawało mi się, że jeżeli nie zwracam danych poprzez return to powinienem używać typu void.
Mogę oczywiście zmienić typ, ale skoro mam tutaj wiele różnych typów to jaki powinienem zrobić to najrozsądniej?
Poza tym jak stworzyć tablicę obiektów klasy Zamowienie?

Main
KOD cpp:     UKRYJ  
#include <iostream>
#include <Windows.h>
#include "zamowienie.h"

using namespace std;

int main()
{
        int ile;
        cout<<"Ile towarow chcesz zamowic? ";
        cin>>ile;
       
        int* t=new int[ile];
       
        Zamowienie n;  
        for(int i=0; i<ile; i++)
                {
                        t[i]=n.zapisz_dane();
                }
       
        system("pause");
        return 0;
}


Zamowienie.h
KOD cpp:     UKRYJ  
#include <iostream>

using namespace std;

class Zamowienie
{
private:
        string nazwa_produktu;
        float cena_produktu;
        float data_zakupu;
        int liczba_sztuk;
public:
        void zapisz_dane(); // tu powstaje problem
        void wyswietl_dane();
        string podaj_nazwe_produktu();
        float podaj_cene();
        float podaj_date_zakupu();
        int podaj_liczbe_sztuk();
        void podaj_koszt();
};


Zamowienie.cpp
KOD cpp:     UKRYJ  
#include <iostream>
#include "zamowienie.h"

using namespace std;

void Zamowienie::zapisz_dane()
{
        cout<<"Podaj nazwe produktu: ";
        cin>>Zamowienie::nazwa_produktu;
        cout<<"Podaj cene produktu: ";
        cin>>Zamowienie::cena_produktu;
        cout<<"Podaj date zakupu: ";
        cin>>Zamowienie::data_zakupu;
        cout<<"Podaj liczbe sztuk: ";
        cin>>Zamowienie::liczba_sztuk;
}

void Zamowienie::wyswietl_dane()
{
       
}

string Zamowienie::podaj_nazwe_produktu()
{
        return nazwa_produktu;
}

float Zamowienie::podaj_cene()
{
        return cena_produktu;
}

float Zamowienie::podaj_date_zakupu()
{
        return data_zakupu;
}

int Zamowienie::podaj_liczbe_sztuk()
{
        return liczba_sztuk;
}

void Zamowienie::podaj_koszt() // typ do zmiany
{
       
}

Re: Problem z zapisem danych z klasy w tablicy

Nowy postNapisane: czwartek, 30 kwietnia 2015, 15:52
przez Mironas
Twoja tablica t może przechowywać tylko liczby (int). Nie możesz do niej zapisywać bardziej skomplikowanych rekordów.
Utwórz strukturę do przechowywania pojedynczego rekordu a potem tablicę takich elementów (struktur).

Na koniec main() musisz skasować tablicę:
KOD cpp:     UKRYJ  
delete [] t;

Re: Problem z zapisem danych z klasy w tablicy

Nowy postNapisane: czwartek, 30 kwietnia 2015, 16:10
przez nvdante
No tak, nie pomyślałem o typie tablicy :)
A czy mogę utworzyć tablicę typu Zamowienie?
Np.: Zamowienie* t=new Zamowienie[ile]?

Re: Problem z zapisem danych z klasy w tablicy

Nowy postNapisane: czwartek, 30 kwietnia 2015, 16:21
przez Mironas
Raczej powinna to być struktura a nie klasa - do przechowywania danych w tablicy. Ale tak też powinno zadziałać.

Re: Problem z zapisem danych z klasy w tablicy

Nowy postNapisane: czwartek, 30 kwietnia 2015, 16:27
przez nvdante
W sumie mi się udało, bo zrobiłem tak:
KOD cpp:     UKRYJ  
        Zamowienie* t=new Zamowienie[ile];
       
        Zamowienie n;  
        for(int i=0; i<ile; i++)
                {
                        t[i].zapisz_dane();
                }

Ale czy możecie mi powiedzieć dlaczego nie powinienem używać obiektu do komunikacji z klasą?
Nie powinno być tak?
Kod: Zaznacz cały
t[i]=n.zapisz_dane();

Re: Problem z zapisem danych z klasy w tablicy

Nowy postNapisane: czwartek, 30 kwietnia 2015, 17:49
przez Mironas
Nie 'obiektu' tylko 'klasy'. Zarówno struktura jak i klasa są obiektami.

Nie pisałem, że nie powinieneś. Zazwyczaj w tablicy przechowuje się dane, a do tego wystarczy struktura. Ale jeśli masz klasy które przechowują dane i posiadają swoje metody (wykonują na tych danych operacje) to wszystko jest jak najbardziej w porządku. Podany przykład użycia metody zapisz_dane() jest poprawny.

Pamiętaj na koniec usunąć tablicę z pamięci.

Re: Problem z zapisem danych z klasy w tablicy

Nowy postNapisane: czwartek, 30 kwietnia 2015, 19:51
przez polymorphism
Raczej powinna to być struktura a nie klasa - do przechowywania danych w tablicy.

A cóż to za mitologia?! W C++ struktura to to samo (z drobnym wyjątkiem) co klasa. Jedyny powód, dla którego struktura istnieje w C++, to zgodność z językiem C. Żadnych innych specjalnych zastosowań nie ma.

Re: Problem z zapisem danych z klasy w tablicy

Nowy postNapisane: czwartek, 30 kwietnia 2015, 20:29
przez nvdante
@Mironas nie mówię, że pisałeś, ale ten kod co napisałem nie używa, nie wiem, jak to nazwać, może "metody" m.zapisz_dane() tylko samo zapisz_dane() i dlatego nie rozumiem tego. Wszędzie, gdzie widziałem przykłady klas to zawsze było odwołanie w stylu: Nazwa_klasy cos, a później cos.metoda() i dlatego jestem zdziwiony.

Re: Problem z zapisem danych z klasy w tablicy

Nowy postNapisane: piątek, 1 maja 2015, 12:30
przez polymorphism
Metody prawie zawsze wywołujesz na rzecz jakiegoś obiektu danej klasy, dlatego w tych przykładach musisz mieć jakąś definicję obiektu, a że wygląda ona tak jak pokazałeś... Przykłady maja to do siebie, że mają być proste w przekazie.

Re: Problem z zapisem danych z klasy w tablicy

Nowy postNapisane: poniedziałek, 4 maja 2015, 09:21
przez nvdante
Rozumiem, dzięki :)

Re: Problem z zapisem danych z klasy w tablicy

Nowy postNapisane: wtorek, 12 maja 2015, 11:13
przez nvdante
Jeszcze jedno pytanko.
Taki kod:
main.cpp
KOD cpp:     UKRYJ  
#include <iostream>
#include <windows.h>
#include "klasa.h"

using namespace std;

int main()
{
        Urzadzenie u1;
//      u1.daj_firme();
                for(int i=0; i<1; i++)
                {
                        u1.daj_firme();
                }
       
        system ("pause");
        return 0;      
}

klasa.h
KOD cpp:     UKRYJ  
#include <iostream>

using namespace std;

class Urzadzenie
{
private:
        string firma;
public:
        string daj_firme();
};


klasa.cpp
KOD cpp:     UKRYJ  
#include <iostream>
#include "klasa.h"

using namespace std;

string Urzadzenie::daj_firme()
{
        cout<<"Producent: ";
        cin>>Urzadzenie::firma;
}


Problem polega na tym, że bez pętli program się zawiesza, a po użyciu pętli działa dobrze.
Jakiś pomysł dlaczego i jak to poprawić?
Dodatkowo czy skoro cała metoda odwołuje się do klasy Urzadzenie to czy pobierając dane wewnątrz tej metody również muszę odwoływać się do konkretnej klasy czy mogę już bezpośrednio do pól? Dokładniej skoro mam string Urzadzenie::daj_firme() to czy konieczne jest cin>>Urzadzenie::firma; ?

Re: Problem z zapisem danych z klasy w tablicy

Nowy postNapisane: wtorek, 12 maja 2015, 11:32
przez Mironas
Bezpośrednio do pól.

Re: Problem z zapisem danych z klasy w tablicy

Nowy postNapisane: wtorek, 12 maja 2015, 14:05
przez polymorphism
Jakiś pomysł dlaczego i jak to poprawić?

Błędu w kodzie nie ma, ale używasz Deva, więc cholera wie, która wersja MinGW tam jest.

Re: Problem z zapisem danych z klasy w tablicy

Nowy postNapisane: wtorek, 12 maja 2015, 18:27
przez nvdante
@Mironas, dzięki, poprawione :)
@polymorphism, faktycznie kompilator powodował problem, teraz odpalam na VS Community 2013 i jest ok. Dzięki!

Re: Problem z zapisem danych z klasy w tablicy

Nowy postNapisane: wtorek, 12 maja 2015, 18:57
przez polymorphism
No widzisz. A już jakiś czas temu pisałem Ci, żebyś zmienił środowisko na bardziej pewne (chyba że to nie byłeś Ty).