Avatar billede mxs Nybegynder
14. august 2007 - 16:52 Der 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)
{

  memcpy(jobTask, j.getTask(), sizeof(*j.getTask()));
  return *this;

}

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?

På forhånd tak,
Martin Slot
Avatar billede mxs Nybegynder
14. august 2007 - 17:09 #1
Måske var der også nogen der kunne forklare mig hvorfor operator=() funktionen skal returnere job&, er det ment som en reference til et job objekt?
Avatar billede mxs Nybegynder
14. august 2007 - 17:37 #2
Er det fordi, ligesom når man fx. skal have en stor array parset til en funktion, er nemmere at pege på den, end at kopierer den?
Avatar billede kenneth_gorking Nybegynder
14. august 2007 - 18:31 #3
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:

job.h  : task* getTask() const;
job.cpp: task* job::getTask() const
        {
          // ...
        }

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.
Avatar billede mxs Nybegynder
14. august 2007 - 18:42 #4
Du siger at den efterfølgende vil blive slettet, vil sige, at den ved returnering vil blive slettet? Og man derfor ikke kan få tallet?
Avatar billede mxs Nybegynder
14. august 2007 - 18:46 #5
Glem det :) Jeg forstår jo godt hvad det er der forgår.
Avatar billede mxs Nybegynder
14. august 2007 - 18:46 #6
smid et svar og få point.
Avatar billede kenneth_gorking Nybegynder
15. august 2007 - 16:11 #7
Svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester