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

Problem z zapisem danych z klasy w tablicy

dział ogólny

Problem z zapisem danych z klasy w tablicy

Nowy postprzez nvdante » czwartek, 30 kwietnia 2015, 15:33

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
{
       
}
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem z zapisem danych z klasy w tablicy

Nowy postprzez Mironas » czwartek, 30 kwietnia 2015, 15:52

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;
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 467
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 22
Otrzymał podziękowań: 66
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Problem z zapisem danych z klasy w tablicy

Nowy postprzez nvdante » czwartek, 30 kwietnia 2015, 16:10

No tak, nie pomyślałem o typie tablicy :)
A czy mogę utworzyć tablicę typu Zamowienie?
Np.: Zamowienie* t=new Zamowienie[ile]?
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem z zapisem danych z klasy w tablicy

Nowy postprzez Mironas » czwartek, 30 kwietnia 2015, 16:21

Raczej powinna to być struktura a nie klasa - do przechowywania danych w tablicy. Ale tak też powinno zadziałać.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 467
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 22
Otrzymał podziękowań: 66
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Problem z zapisem danych z klasy w tablicy

Nowy postprzez nvdante » czwartek, 30 kwietnia 2015, 16:27

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();
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem z zapisem danych z klasy w tablicy

Nowy postprzez Mironas » czwartek, 30 kwietnia 2015, 17:49

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.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 467
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 22
Otrzymał podziękowań: 66
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Problem z zapisem danych z klasy w tablicy

Nowy postprzez polymorphism » czwartek, 30 kwietnia 2015, 19:51

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z zapisem danych z klasy w tablicy

Nowy postprzez nvdante » czwartek, 30 kwietnia 2015, 20:29

@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.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z zapisem danych z klasy w tablicy

Nowy postprzez polymorphism » piątek, 1 maja 2015, 12:30

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z zapisem danych z klasy w tablicy

Nowy postprzez nvdante » poniedziałek, 4 maja 2015, 09:21

Rozumiem, dzięki :)
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem z zapisem danych z klasy w tablicy

Nowy postprzez nvdante » wtorek, 12 maja 2015, 11:13

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; ?
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem z zapisem danych z klasy w tablicy

Nowy postprzez Mironas » wtorek, 12 maja 2015, 11:32

Bezpośrednio do pól.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 467
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 22
Otrzymał podziękowań: 66
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Problem z zapisem danych z klasy w tablicy

Nowy postprzez polymorphism » wtorek, 12 maja 2015, 14:05

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z zapisem danych z klasy w tablicy

Nowy postprzez nvdante » wtorek, 12 maja 2015, 18:27

@Mironas, dzięki, poprawione :)
@polymorphism, faktycznie kompilator powodował problem, teraz odpalam na VS Community 2013 i jest ok. Dzięki!
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z zapisem danych z klasy w tablicy

Nowy postprzez polymorphism » wtorek, 12 maja 2015, 18:57

No widzisz. A już jakiś czas temu pisałem Ci, żebyś zmienił środowisko na bardziej pewne (chyba że to nie byłeś Ty).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 9 gości

cron