Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Operatoren überladen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
16.03.2004, 18:49 Uhr
Pablo
Supertux
(Operator)


Ich habe das jetzt nur aus Übung gemacht

C++:
// cl.h
#ifndef CAT_H
#define CAT_H

#include <iostream>
class Cat
{
    int val;
public:
    Cat();
    Cat(int x);
    void setval(int x);
    int getval();
    std::ostream& operator<<(std::ostream& out, const Cat& v);
};
#endif




C++:
//cl.cpp
#include "cl.h"
Cat::Cat()
{
  this->val = 0;
}

Cat::Cat(int x)
{
  this->val = x;
}

void Cat::setval(int x)
{
   this->val = x;
}

int Cat::getval()
{
   return this->val;
}

std::ostream& operator<<(std::ostream& out, const Cat& v)
{
  out << v.getval();
  return out;
}

int main()
{
  Cat a,b(1);
  a.setval(19);
  std::cout << "a.getval()=" << a.getval() << std::endl << "b.getval()=" << b.getval() << std::endl;
  return 0;
}



Wieso kriege ich folgenden Fehler? (g++ (GCC) 3.2.3 20030422 )

bash:

rex@supertux:~/programmierung/c++/kkk> g++ cl.cpp -o cl
In file included from cl.cpp:1:
cl.h:13: `std::ostream& Cat::operator<<(std::ostream&, const Cat&)' must take
   exactly one argument
cl.cpp: In function `std::ostream& operator<<(std::ostream&, const Cat&)':
cl.cpp:24: passing `const Cat' as `this' argument of `int Cat::getval()'
   discards qualifiers


Was habe ich falsch gemacht?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 16.03.2004 um 18:49 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.03.2004, 18:58 Uhr
(un)wissender
Niveauwart


Du hast das friend im Header vor deiner operator<<-Funktion vergessen!
Übrigens gibt es einen ~-Operator, der Negierungsoperator.
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 16.03.2004 um 19:00 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.03.2004, 19:00 Uhr
typecast
aka loddab
(Operator)


Zweiter Fehler: Ist, dass getval() const sein muss. Also schreib in der Deklaration

C++:
...
int getval() const;
...


--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)

Dieser Post wurde am 16.03.2004 um 19:01 Uhr von loddab editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.03.2004, 19:02 Uhr
Pablo
Supertux
(Operator)


Habe jetzt eingefügt, trotzdem

Code:
cl.cpp: In function `std::ostream& operator<<(std::ostream&, const Cat&)':
cl.cpp:24: passing `const Cat' as `this' argument of `int Cat::getval()'
   discards qualifiers


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 16.03.2004 um 19:02 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.03.2004, 19:03 Uhr
typecast
aka loddab
(Operator)


Siehe Post 002
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.03.2004, 19:06 Uhr
Pablo
Supertux
(Operator)


Stimmt,

was ich nicht verstehe, warum muss const sein? Und was bedeutet genau const ganz am Schluss?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.03.2004, 19:08 Uhr
typecast
aka loddab
(Operator)


Das sichert dem Kompiler zu, dass diese Funktion den Zustand des Objektes (also die Werte aller Variablen) nicht verändert, sondern konstant lässt.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
17.03.2004, 07:40 Uhr
Pablo
Supertux
(Operator)


Heißt das, wenn ich Funktionen wie getval in die Klasse einfüge, sollte ich sie immer mit const am Schluss definieren?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
17.03.2004, 09:51 Uhr
(un)wissender
Niveauwart


getter sollten immer const sein.
du hattest hier nur Probleme, weil du deinen formalen Parameter in operator<< als const bezeichnet hast (was ja auch richtig ist).
Du kannst aber für const Objekte nur Methoden aufrufen die sonst sind, und das war getval() nicht.
Also, als Richtlinie: alle Membermethoden, die das Objekte nicht verändern, sollten immer const sein.
(Tipp: Man kann Methoden auch anhand ihrer const-heit überladen).
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
17.03.2004, 10:09 Uhr
RHBaum




Zitat:

alle Membermethoden, die das Objekte nicht verändern, sollten immer const sein.


Jupp, und sogar noch paar mehr :-)
Prinzipiell alle Funktionen die du an nem konstanten Objekt aufrufen willst.
schau dir "mutable" dazu an ... braucht man oefter als man denkt:p Besonders wenn man sachen threadsicher machen will ....

Ciao ...

Dieser Post wurde am 17.03.2004 um 10:11 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: