14. august 2007 - 16:52Der er
6 kommentarer og 1 løsning
Forstår ikke rigtig denne error
Jeg får følgende error fra gcc slot@skynet:/mnt/data/Dokumenter/Programmering/C++/Socket/v3$ g++ -Wall job.cpp task.cpp job.cpp: In member function ‘job& job::operator=(const job&)’: job.cpp:83: error: passing ‘const job’ as ‘this’ argument of ‘task* job::getTask()’ discards qualifiers job.cpp:83: error: passing ‘const job’ as ‘this’ argument of ‘task* job::getTask()’ discards qualifiers
Her er min operator=() job& job::operator=(const job& j) {
Hvis jeg fjerner const, så kan jeg godt, men det vil jeg ikke, da j jo så kan ændre sig i løbet af forløbet. Jeg kan ikke rigtig gennemskue fejlmeddelelsen. En der kan hjælpe?
Spøgrsmål 1: Fejlen får du fordi at din 'getTask()' funktion ikke er deklareret som 'const'. Dette betyder at funktionen har tilladelse til at ændre variabler i 'j', men det har den ikke lov til da 'j'-objektet er deklareret som 'const'. Hvis din 'getTask' funktion ikke ændrer nogle værdier i klassen, så kan du ændre den til følgende:
Spørgsmål 2 og 3: Ja det er det. Det er standard fremgangsmåde at operatorer der modificerer det objekt som de bliver kaldet på, returnerer en reference til sig selv. Forestil dig for eksempel en klasse der kan lægge tal sammen, og har overstyret += operatoren.
class Tal { //... Tal& operator+=(const Tal& tal) { // her ændres noget i Tal return *this; } };
Hvis man nu har 3 Tal, og gerne vil lægge dem sammen, kan man gøre som følger (bemærk: dette er grimt kode, og er kun ment som en illustration): Tal a,b,c; //... (a += b) += c; // Akkumuler tallene i 'a'
Fordi += operatoren returnerer en reference til sig selv, bliver resultatet af 'a += b' en reference til 'a', hvorpå der nu kan kaldes '+= c' som også ændrer 'a'. Hvis += operatoren blot havde returneret en kopi af sig selv, ved at være deklareret som 'Tal operator+=(const Tal& tal)', så ville værdien fra tallet 'c' aldrig blive adderet til 'a', men til et midlertidigt Tal som efterfølgende vil blive slettet.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.