• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak poprawnie zainicjalizować obiekt klasy?

Object Storage Arubacloud
0 głosów
464 wizyt
pytanie zadane 23 stycznia 2019 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)

Proszę o pomoc - w którym miejscu zainicjalizować obiekt klasy magazyn aby pozbyć się komunikatu cannot call member function without an object? Obiekt tej klasy będzie istniał tylko jeden przez cały czas działania programu.

plik .h

#include <iostream>
#include <vector>

using namespace std;
//---------------------------------------------------------------------------------
//FUNKCJE
void menu_glowne();
string male_litery(string napis);

//FUNKCJE
//----------------------------------------------------------------------------
//KLASY
class Towar {
    friend class Magazyn;
    string nazwa_tow;
    int ilosc;
    int indeks_tow;
    float cena_tow;
public:
    Towar(const string, int, const int, float);
    ~Towar();
    void dostawa();
    void odtowarowanie();
};

class Magazyn {
    friend class Towar;

    protected:
    vector < Towar > magazyn;

    public:
    void wczytaj_magazyn();
    void wyswietl_magazyn();
    void zapisz_magazyn();
    bool czy_jest_w_magazynie(string nazwa);
    Magazyn();
    ~Magazyn();
};
//KLASY
//----------------------------------------------------------------------------------------------

plik.cpp

#include "projekt.h"
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <cstdlib>
#include <string>
#include <vector>
#include <windows.h>

using namespace std;

vector < Towar > magazyn;

void menu_glowne(){
        cout << "|-------------PROGRAM OBSLUGI SKLEPU--------------|" << endl;
        cout << "| 1. SPRZEDAZ                                     |" << endl;
        cout << "| 2. ZAMOWIENIE                                   |" << endl;
        cout << "| 3. MAGAZYN                                      |" << endl;
        cout << "| 4. BAZA DOKUMENTOW                              |" << endl;
        cout << "| 5. ZAMKNIJ PROGRAM                              |" << endl;
        cout << "|-------------------------------------------------|" << endl;

        int akcja;
        cin>>akcja;

        switch(akcja){

        case 1:
            {

             break;
            }
        case 2:
            {

             break;
            }
        case 3:
            {

             break;
            }
        case 4:
            {

             break;
            }
        case 5:
            {
             exit(0);
            }
        }
}
//--------------OSOBNE FUNCKJE-------------
string male_litery(string napis){
    for( char & znak: napis ) {
        if( znak >= 'A' && znak <= 'Z' ) {
            znak += 32;
        }
    }
   return napis;
}

//-------------KLASA MAGAZYN-------------------

void Magazyn::wczytaj_magazyn(){ //odczyt z pliku
    Magazyn magazyn();

    fstream plik;
    plik.open("magazyn.txt", ios::in);

    if(plik.good()==false) {
        cout<<"Nie mozna wczytac magazynu";
        exit(0);
    }

    string linia, naz;
    int nr_linii = 1, ile, ind;
    float cen;
    while(getline(plik, linia)){
        switch(nr_linii){
        case 1:
            {
                naz = linia;
                nr_linii++;
                break;
            }
        case 2:
            {
                ile = atoi(linia.c_str());
                nr_linii++;
                break;
            }
        case 3:
            {
                ind = atoi(linia.c_str());
                nr_linii++;
                break;
            }
        case 4:
            {
                cen = atof(linia.c_str());
                Towar * nowy = new Towar(naz, ile, ind, cen);
                magazyn.push_back(nowy);
                nr_linii = 1;
                break;
            }
        }
    }
    plik.close();
}

void Magazyn::zapisz_magazyn(){//zapis do pliku

    fstream plik;
    plik.open("magazyn.txt", ios::trunc | ios::app);
    string naz;
    int ile, ind;
    float cena;

    for( int i = 0; i < magazyn.size(); i++){
        naz = magazyn[i].nazwa_tow;
        ile = magazyn[i].ilosc;
        ind = magazyn[i].indeks_tow;
        cena = magazyn[i].cena_tow;
        plik<<naz<<endl;
        plik<<ile<<endl;
        plik<<ind<<endl;
        plik<<cena<<endl;
    }
    plik.close();
}

bool Magazyn::czy_jest_w_magazynie(string nazwa){
    if(magazyn.empty() == true){
        return false;
    }
    else{
        for( int i = 0; i < magazyn.size(); i++){
            if(magazyn[i].nazwa_tow == nazwa){
                return true;
                }
            else return false;
        }
    }
}

//-------------KLASA TOWAR---------------

Towar::Towar(string n, int il, int in, float cen){
    nazwa_tow = n;
    ilosc = il;
    indeks_tow = in;
    cena_tow = cen;
}

Towar::~Towar(){
    cout<<"Destruktor klasy Towar";
}

void Towar::dostawa(){
    string nazwa;
    int ile, indeks;
    float cena;
    char zmiana;
    cout<<"Przyjecie magazynowe"<<endl;
    cout<<"Nazwa towaru: ";              cin>>nazwa;
    cout<<"Ilosc: ";                     cin>>ile;
    cout<<"Indeks - szesc cyfr: ";       cin>>indeks;
    cout<<"Cena: ";                      cin>>cena;

    nazwa = male_litery(nazwa);



}

 

3 odpowiedzi

0 głosów
odpowiedź 23 stycznia 2019 przez criss Mędrzec (172,590 p.)
Najprościej globalnie (przyda się słówko extern), druga opcja to pattern Singleton. Jeszcze inaczej: np. w main i przekazywać ten obiekt przez parametry metod/funkcji tam gdzie jest potrzebny.
0 głosów
odpowiedź 23 stycznia 2019 przez gagyn Stary wyjadacz (11,050 p.)
Przedstawiłeś definicję klasy magazyn i towar. Obiekty klasy towar, tak jak teraz masz tworzysz z klasie magazyn, a obiekt klasy magazyn powinieneś stworzyć w funkcji, która ma wywoływać funkcje klasy magazyn (podejrzewam, że to jest funkcja main).
0 głosów
odpowiedź 23 stycznia 2019 przez Alan Kruszyński Obywatel (1,410 p.)

Uporałem się z błędem, ale mam jeszcze jedno pytanie. W klasie magazyn mam zadeklarowany wektor o nazwie magazyn. Czy jest on inicjalizowany w momencie zainicjalizowania obiektu klasy Magazyn? i jak wywołać metodę wektora? np tutaj, gdy zainicjalizuję obiekt o_magazyn klasy Magazyn i chcę odwołać się do wektora który zawiera klasa Magazyn:

void Magazyn::wczytaj_magazyn(Magazyn & obiekt){ //odczyt z pliku

    fstream plik;
    plik.open("magazyn.txt", ios::in);

    if(plik.good()==false) {
        cout<<"Nie mozna wczytac magazynu";
        exit(0);
    }

    string linia, naz;
    int nr_linii = 1, ile, ind;
    float cen;
    while(getline(plik, linia)){
        switch(nr_linii){
        case 1:
            {
                naz = linia;
                nr_linii++;
                break;
            }
        case 2:
            {
                ile = atoi(linia.c_str());
                nr_linii++;
                break;
            }
        case 3:
            {
                ind = atoi(linia.c_str());
                nr_linii++;
                break;
            }
        case 4:
            {
                cen = atof(linia.c_str());
                Towar * nowy = new Towar(naz, ile, ind, cen);
                magazyn.push_back(nowy);
                nr_linii = 1;
                break;
            }
        }
    }
    plik.close();
}

pod koniec instrukcji jest linijka wywołująca pushback() na wektorze magazyn który jest polem klasy Magazyn, czyli umieszczam obiekt w kontenerze ale otrzymuję komunikat no matching function for call..." 

Podobne pytania

0 głosów
1 odpowiedź 123 wizyt
pytanie zadane 21 stycznia 2019 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)
0 głosów
1 odpowiedź 217 wizyt
0 głosów
1 odpowiedź 522 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...