szablon listy i przeciążenie operatora ==

0

Mam utworzoną liste za pomocą kontenera <list> o nazwie Lista_zadan, która się składa z klas o nazwie Zadania. Chciałbym usunąć z niej element za pomocą metody Lista_zadan.remove(Obiekt klasy Z).

int main(void){
				
 list<Zadanie> Lista_zadan;
 Zadanie Z; 
 ...
 Lista_zadan.remove(Z);
...
}

Zawartość plików Zadania.hh i Zadania.cpp

#ifndef ZADANIE_HH
#define ZADANIE_HH

#include <iostream>

using namespace std;

class Zadanie{
public:
	Zadanie();
	~Zadanie(){};
	float r() const { return parametry[0]; }
	float &r() { return parametry[0]; }
	float p() const { return parametry[1]; }
	float &p() { return parametry[1]; }
	float q() const {return parametry[2];}
	float &q() { return parametry[2]; }
	
	friend ostream &operator << (ostream &o, Zadanie &Z);
       friend istream &operator >> (istream &i, Zadanie &Z);
	
      bool operator == (Zadanie &A);
	
private:
	float parametry[3];
	//parametry[0] - parametr r
	//parametry[1] - parametr p
	//parametry[2] - parametr q 
};

#endif
#include <iostream>
#include "Zadanie.hh"

using namespace std;

Zadanie::Zadanie(){
parametry[0]=0;
parametry[1]=0;
parametry[2]=0;
}

ostream &operator << (ostream &o, Zadanie &Z){
                o << Z.r() <<" "<< Z.p()<<" "<< Z.q()<<endl;
                return o;
}
istream &operator >> (istream &i, Zadanie &Z){
                i >> Z.r() >> Z.p()>> Z.q();
                return i;
}

bool Zadanie::operator == (Zadanie &A){
 if(    ( A.r() == this->r() ) 
    || ( A.p() == this->p() ) 
    || ( A.q() == this->q() )  )
 return true;
 else return false;				
}

Aby wykorzystać tą metode trzeba zdefiniować przeciążenie operatora ==. Jednak nie potrafie sobie z tym poradzić i przy kompilacji pojawiają się błędy:

 C:\Dev-Cpp\include\c++\3.4.2\bits\list.tcc In member function `void std::list<_Tp, _Alloc>::remove(const _Tp&) [with _Tp = Zadanie, _Alloc = std::allocator<Zadanie>]': 

17 C:\Dev-Cpp\main.cpp   instantiated from here 

181 C:\Dev-Cpp\include\c++\3.4.2\bits\list.tcc no match for 'operator==' in '(&__first)->std::_List_iterator<_Tp>::operator* [with _Tp = Zadanie]() == __value' 

 note C:\Dev-Cpp\Zadanie.hh:22 candidates are: bool Zadanie::operator==(Zadanie&) 

 C:\Dev-Cpp\Makefile.win [Build Error]  [main.o] Error 1 
0

powinienes prawidlowo przeciazyc operator== :

  bool operator==(const Zadanie &) const {
    // ...
  }

Poczytaj plik list.tcc i zawsze uzywaj const tam gdzie nie modyfikujesz danych!

0

Dziękuje pomogło :)
Tylko pojawił się nowy problem. Dlaczego ta metoda Lista_zadan.remove(Z) usuwa 2 elementy z listy? Wypisałem wynik przed, po i wyraźnie to widać.

0

Już sobie poradziłem. W definicji przeciązenia operatora powinien być iloczyn logiczny && a nie suma ||.

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