Problem z obiektami vector

0

Mam do napisania projekt, który będzie imitował pojemnik na śmieci. Generalnie dwie klasy - odpad i pojemnik i parę przeciążonych operatorów. Napisałem to ale nie wiem dlaczego nie działają najprostsze funkcje. Wygląda na to, że po wyjściu z ciała jakiejś funkcji zniszczeniu ulegają wszystkie obiekty. Może ktoś będzie potrafił rozwiązać ten problem.

Oto kod:

#include <iostream>
#include <vector>

using namespace std;

enum rodzaj_odpadu {szklo, papier, plastik};

class odpad
{
      public: 
      int wartosc;
      int waga;
      enum rodzaj_odpadu rodzaj;
      
      
      odpad(int wart, int wag, rodzaj_odpadu r_o)
      {
                cout<<"odpad zostal stworzony konstruktor z wartosciami"<<endl;
                wartosc=wart;
                waga=wag;
                rodzaj=r_o;
      };
      
      odpad(void) {cout<<"odpad zostal stworzony konstruktor domyslny"<<endl;};
      ~odpad(void){cout<<"odpad zostal zniszczony, dziala destruktor:"<<waga<<endl;}; //destruktor    
};

class pojemnik : public odpad
{
      public:
             vector<odpad> kontener;
             vector<odpad>::iterator it_1;
             
             pojemnik(void){cout<<"pojemnik zostal stworzony"<<endl;};
             ~pojemnik(void){cout<<"pojemnik zostal zniszczony"<<endl;};
             
             pojemnik operator + (odpad);
             pojemnik operator - (odpad);
             pojemnik operator + (pojemnik);
             pojemnik operator == (pojemnik);
             pojemnik & operator = (pojemnik & wzor);
             pojemnik operator < (pojemnik);
             
             void czy_pusty();
             void wypisz();
             void wprowadz_odpad();
             void czy_odpad(rodzaj_odpadu r_o);
             void ile_odpadow(rodzaj_odpadu r_o);
             
             friend istream & operator >> (istream & klawiatura, pojemnik & poj);
             friend ostream & operator << (ostream & ekran, pojemnik & poj);
};

pojemnik pojemnik::operator + (odpad odp) //definicja operatora +
{
         pojemnik wynik;
         for(it_1=kontener.begin(); it_1!=kontener.end();it_1++)
                           wynik.kontener.push_back(*it_1);
         wynik.kontener.push_back(odp);
         cout<<"odpad dodany do pojemnika"<<endl;
         return wynik; 
         
         //kontener.push_back(odp);
         //cout<<"odpad dodany do pojemnika"<<endl;
         //return *this;
}

pojemnik pojemnik::operator - (odpad odp) //definicja operatora +
{
         kontener.pop_back(); //dodanie odpadu do pojemnika
         cout<<"odpad usuniety z pojemnika"<<endl;
         return *this;
}

pojemnik pojemnik::operator + (pojemnik poj) //definicja operatora dodawania pojemnikw
{
         pojemnik wynik;
         for(poj.it_1=poj.kontener.begin();poj.it_1!=poj.kontener.end();poj.it_1++)
         kontener.push_back(*poj.it_1);
         cout<<"pojemniki zostaly polaczone"<<endl;
}      

pojemnik pojemnik::operator == (pojemnik poj)
{
              poj.it_1=poj.kontener.begin();
              
              if (kontener.size()!=poj.kontener.size())
              cout<<"pojemniki sa roznych rozmiarow"<<endl;
              else
              {
                  for (it_1=kontener.begin(); it_1!=kontener.end();it_1++)
                  {
                      if(it_1!=poj.it_1)
                      cout<<"pojemniki nie sa takie same"<<endl;
                      break;
                      poj.it_1++;
                  }
                  cout<<"pojemniki sa identyczne";
              }
}             

pojemnik pojemnik::operator < (pojemnik poj)
{
     if(kontener.size()<poj.kontener.size())
     cout<<"pojemnik 2 jest ciezszy od pojemnika 1"<<endl;
     else if(kontener.size()>poj.kontener.size())
     cout<<"pojemnik 1 jest ciezszy od pojemnika 2"<<endl;
     else
     cout<<"pojemniki sa tak samo ciezkie"<<endl;
}

pojemnik & pojemnik::operator = (pojemnik & wzor)
{
     kontener.clear();
     
     for(wzor.it_1=wzor.kontener.begin(); wzor.it_1!=wzor.kontener.end();wzor.it_1++)
                           kontener.push_back(*wzor.it_1);
     return *this;
}

void pojemnik::czy_pusty()
{
     if (kontener.size()!=0)
     cout<<"pojemnik nie jest pusty"<<endl;
     else
     cout<<"pojemnik jest pusty"<<endl;
}

void pojemnik::czy_odpad(rodzaj_odpadu r_o)
{
     for(it_1=kontener.begin(); it_1!=kontener.end();it_1++)
     {
                                if(rodzaj==r_o)
                                cout<<"pojemnik posiada odpady typu "<<r_o<<endl;
     }
}

void pojemnik::ile_odpadow(rodzaj_odpadu r_o)
{
     int licz=0;
     
     for(it_1=kontener.begin(); it_1!=kontener.end();it_1++)
     {
                                if(rodzaj==r_o)
                                {
                                               licz++;
                                               cout<<"odpad typu "<<rodzaj_odpadu(r_o)<<"nr "<<licz<<endl;
                                               cout<<"waga "<<waga<<" wartosc "<<wartosc;
                                }
     }
     
}

istream& operator >> (istream& klawiatura, pojemnik& poj)
{
        odpad odp;
        cout<<"podaj wartosc"<<endl;
        klawiatura>>odp.wartosc;
        cout<<"podaj wage"<<endl;
        klawiatura>>odp.waga;
        poj.kontener.push_back(odp);
        cout<<"odpad dodany";
        return klawiatura;
}
        
ostream& operator << (ostream& ekran, pojemnik& poj)
{
        ekran<<"zawartosc pojemnika"<<endl;
        for(poj.it_1=poj.kontener.begin(); poj.it_1!=poj.kontener.end();poj.it_1++)
                           ekran<<"waga "<<poj.waga<<" wartosc "<<poj.wartosc<<endl;
        return ekran;
}





int main()
{
    pojemnik poj_1;
    pojemnik poj_2;
    
    odpad butelka(3,1,plastik);
    odpad sloik(4,2,szklo);
    odpad gazeta(10,4,papier);
    
    cin>>poj_1;
    cout<<poj_1;
//test_dodawania
    //poj_1+butelka;
    //cout<<poj_1;
    
    //poj_1+sloik;
    //cout<<poj_1;
    
    //poj_1+gazeta;
    //cout<<poj_1;
    
// test_odejmowania()
/*
    poj_1+butelka+sloik+gazeta+gazeta;
    poj_1-butelka;
    cout<<poj_1;
    
    poj_1-sloik;
    cout<<poj_1;
    
    poj_1-gazeta;
    cout<<poj_1;
*/
//test_dodawania_pojemikow()


// test_porownania()

// test_ciezkosci()

// test_przypisania()

// test_czy_pusty()

// test_czy_odpad()

// test_ile_odpadow()

// test_wypisz()

// test_wprowadz_odpad()

    system("pause");
    return 0;
}

 

Z góry dzięki

1
c:\pp\myprogs\cpp\a.cpp(100) : error C4716: 'pojemnik::operator==' : must return a value
c:\pp\myprogs\cpp\a.cpp(110) : error C4716: 'pojemnik::operator<' : must return a value
c:\pp\myprogs\cpp\a.cpp(81) : error C4716: 'pojemnik::operator+' : must return a value
0

U mnie się wszystko kompiluje jak trzeba. Nie wyrzuca mi tych errorów co tobie.

1

pojemnik pojemnik::operator == (pojemnik poj)
{
poj.it_1=poj.kontener.begin();

          if (kontener.size()!=poj.kontener.size())
          cout<<"pojemniki sa roznych rozmiarow"<<endl;
          else
          {
              for (it_1=kontener.begin(); it_1!=kontener.end();it_1++)
              {
                  if(it_1!=poj.it_1)
                  cout<<"pojemniki nie sa takie same"<<endl;
                  break;
                  poj.it_1++;
              }
              cout<<"pojemniki sa identyczne";
          }

}

Co to jest? Przekazujesz argumenty przez wartosc a nie przez referencje? Po drugie porownanie dwoch objektow powinno zwracac bool, a u ciebie zwraca niby objekt (wynika to z deklaracji) ale tak naprawde to nic nie zwraca.

0

Widze, ze wszedzie robisz passing by value a nie by reference. Do tego nie rozumiem, w jakim celu masz ten iterator w klasie. Do tego raczej nie przechowywalbym odpadow w vector<class>, tylko cos bardziej rozsadnego vector<boost::shared_ptr<class> >.

Pozdrawiam serdecznie

0
xiaoxiao21 napisał(a)

U mnie się wszystko kompiluje jak trzeba. Nie wyrzuca mi tych errorów co tobie.

g++.exe -ansi -pedantic -Wall -Wextra -Wundef -Wnon-virtual-dtor -Woverflow -Wunused -c -O3 -Werror -s -MMD -MP -MF build/Release/MinGW-Windows/cpp_main.o.d -o build/Release/MinGW-Windows/cpp_main.o cpp_main.cpp
cc1plus.exe: warnings being treated as errors
cpp_main.cpp:76:10: error: unused parameter 'odp'
cpp_main.cpp: In member function 'pojemnik pojemnik::operator+(pojemnik)':
cpp_main.cpp:89:1: error: no return statement in function returning non-void
cpp_main.cpp: In member function 'pojemnik pojemnik::operator==(pojemnik)':
cpp_main.cpp:105:1: error: no return statement in function returning non-void
cpp_main.cpp: In member function 'pojemnik pojemnik::operator<(pojemnik)':
cpp_main.cpp:114:1: error: no return statement in function returning non-void
cpp_main.cpp: In function 'int main()':
cpp_main.cpp:220:19: error: 'system' was not declared in this scope 

Podejrzewam, że nie jesteś świadom tego, że kompilatory uruchamiane z domyślnymi opcjami często mają bardzo, że tak to ujmę, liberalne podejście do kodu przez Ciebie wklepanego. Czytaj, kod który nie jest zgodny ze standardem może zostać skompilowany, co nie znaczy, że zadziała tak jak chcesz. Przy użyciu MinGW/GCC powinieneś używać co najmniej -ansi -pedantic -Wall -Wextra. Właściwie to dobrze jest używać Tak, prawdopodobnie Twoje istniejące kody po skompilowaniu z takimi opcjami zaświecą się na czerwono, ale uwierz mi, że na dłuższą metę wyjdzie Ci to tylko na dobre - a pisanie tak jak teraz może jedynie wyjść bokiem. ;)

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