Avatar billede thomas_nj Nybegynder
20. marts 2005 - 21:53 Der er 8 kommentarer og
1 løsning

Operator overload går ikke helt efter planen

Hej eksperter

  Jeg har igen problemer med den koordinatklasse. Det har virket så jeg har selv skabt problemet ved at forsøge at flytte funktionerne ud af klassen. Lidt nedbarberet har jeg koden:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Point
{
public:
  Point(const int&, const int&);
  ~Point(void);

  class Coor
  {
  public:
    Coor(const int&);
    ~Coor(void);
    Coor & operator ++();

    int c;
  };

  Coor x;
  Coor y;
};

int main()
{
    Point a(2,2);
    a.y++;
    return 0;
}




Point::Point(const int& aX, const int& aY) : x(aX), y(aY)
{
}

Point::~Point(void)
{
}

Point::Coor::Coor(const int& aC)
{
  c=aC;
}

Point::Coor::~Coor(void)
{
}

Point::Coor &Point::Coor::operator ++()
{
  c++;
  return *this;
}


Jeg får følgende fejl: J:/Source/windows.cpp:39: error: no `operator++(int)' declared for postfix `++

  Er der en, der kan se, der der går galt?
Avatar billede arne_v Ekspert
20. marts 2005 - 21:58 #1
MS VC++ 7.1 giver kun en warning.

z.cpp(30) : warning C4620: no postfix form of 'operator ++' found for type 'Poin
t::Coor', using prefix form
        z.cpp(14) : see declaration of 'Point::Coor'

Den siger at den ikke kan finde:

a.y++;

og derfor har valgt:

++a.y;
Avatar billede thomas_nj Nybegynder
20. marts 2005 - 22:02 #2
Den giver stadig en fejl hvis jeg sætter ++ foran.
Avatar billede arne_v Ekspert
20. marts 2005 - 22:04 #3
For

a.y++;

prøv:

Coor & operator ++(int notused);

og

Point::Coor &Point::Coor::operator ++(int notused)
{
  c++;
  return *this;
}
Avatar billede thomas_nj Nybegynder
20. marts 2005 - 22:08 #4
Så virker det igen. Forstår bare ikke hvorfor den pludselig ikke virkede mere, for har ændret lidt ad gangen og compilet og testet uden problemer.
Nå men mange tak for hjælpen
Avatar billede bertelbrander Novice
20. marts 2005 - 23:14 #5
Hvis det skal være en rigtig post ++ skal det vist være:

Point::Coor Point::Coor::operator ++(int notused)
{
  Point::Coor Temp(*this);
  c++;
  return Temp;
}

Hvilket også demonstrerer hvorfor det er "billigere" at bruge ++i end i++
Avatar billede segmose Nybegynder
22. marts 2005 - 11:51 #6
MS VC++ 7.1 lader ikke til at give de korrekte fejl meldinger og at den substituere med prefix er fuldstændigt uacceptabelt da der kunne være en fejl i definitionen af postfix der gør at den ikke bliver valgt.

Brug Bertels implementation, som er rigtig.
Avatar billede arne_v Ekspert
22. marts 2005 - 23:16 #7
Den gav faktisk den præcise fejl meddelse. Den er oven i købet dokumenteret
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/C4620.asp

Men vi kan sagtens blive enig om at dens konvertering bygger på en antagelse
om at programmøren har valgt en traditionel semantik.
Avatar billede thomas_nj Nybegynder
25. marts 2005 - 16:34 #8
Hov kan se jeg har glemt at lukke.
arne_v >> gider du ikke svare?
Avatar billede arne_v Ekspert
25. marts 2005 - 16:37 #9
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