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

Gdzie zainicjalizować ten obiekt klasy?

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

Błąd w pliku .cpp w 102 linijce rzecze Cannot call member function without an object. Tylko nie za bardzo wiem gdzie właściwie mam zainicjalizować obiekt Klasy magazyn. W zamyśle mam jeszcze napisać m.in. funkcję która przy uruchomieniu programu tworzy obiekt klasy magazyn i zapełnia wektor danymi z pliku. Czy napisanie takiej funkcji i umiejscowienie jej w pliku .cpp przed metodą dostawa załatwi sprawę? Jeśli nie to co proponujecie?

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(string, int, 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);

};
//KLASY
//----------------------------------------------------------------------------------------------

plik .cpp

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

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-------------------


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;
}


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);

    if(Magazyn::czy_jest_w_magazynie(nazwa) == true){        //sprawdz czy jest w magazynie
        for( int i = 0; i < magazyn.size(); i++){            //przeszukuj magazyn
            if(magazyn[i].nazwa_tow == nazwa){               //jesli jest - dodaj ilosc i zapytaj czy aktualizowac cene
                magazyn[i].ilosc += ile;//dodaj ilosc
                cout<<endl<<"Czy zmienic cene z "<<magazyn[i].cena<<" na "<<cena<<"? (T/N)";//zapytaj czy zmienic cene
                cin>>zmiana;
                if (zmiana == T || zmiana == t){// jesli TAK - zmien cene
                    magazyn[i].cena = cena;
                }
                else break;
            }
            else break;
        }
    }
    else{//jesli nie ma w magazynie - dodaj do magazynu
            Towar telewizor(nazwa, ile, 4111, 1999.99);
            magazyn.push_back(telewizor);
    }



        else cout<<"Dodanie towaru nieudane - nieznany towar"<<endl;

    cout<<"Dodano do magazynu";
    }

 

komentarz 22 stycznia 2019 przez MikDal Mądrala (5,660 p.)

Czy musi to być wykonane z operatorem friend? Według mnie, i literatury którą czytałem, nie jest to najlepszy sposób na realizację zależności pomiędzy klasami. Ja proponowałbym zrealizować to zadanie bez relacji przyjacielskich między klasami i wtedy zobaczyłbym czy działa.

1 odpowiedź

0 głosów
odpowiedź 22 stycznia 2019 przez j23 Mędrzec (194,920 p.)

Ale jak to? Towar sprawdza, czy jest w magazynie? Dziwaczne to... IMO metoda Towar::dostawa powinna być metodą klasy Magazyn.

Podobne pytania

0 głosów
3 odpowiedzi 461 wizyt
0 głosów
1 odpowiedź 217 wizyt
0 głosów
1 odpowiedź 513 wizyt

92,556 zapytań

141,404 odpowiedzi

319,561 komentarzy

61,942 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!

...