/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
funktionskald i overloading
Fra : Jesper Gødvad


Dato : 12-06-01 23:34

Hej Alle.

Jeg har lavet en overloaded funktion til min klasse

class MinKlasse {
string returStreng() { return "min tekst"; }
friend string& operator <<( string&, const MinKlasse& );
};

string& operator<< (string& ud, const MinKlasse & kilde ) {
ud += min_streng; // virker fint
ud += fri_funktion( min_streng ); // virker også fint
ud += kilde.returStreng(); // virker ikke
}

Resultatet er følgende kompileringsfejl under g++, RedHat Linux:

parsing const MinKlasse' as 'this' argument of const string
MinKlasse::returSteng() ' discards qualifiers

Hvorfor kan jeg ikke kalde funktionen og hvad "betyder" fejl-meddelelsen?

Håber nogen kan hjælpe.

mvh. jesper



 
 
Jonas Meyer Rasmusse~ (13-06-2001)
Kommentar
Fra : Jonas Meyer Rasmusse~


Dato : 13-06-01 00:18

Hejsa.
Jeg har ikke umiddelbart en løsning, men der er nogle uhensigtsmæssigheder i
din kode.

Du returnerer ingen reference til "ud", i slutningen af din funktion.
Det skal du gøre, så vidt jeg ved, ellers vil det vist gå galt når du laver
flere af disse
operationer af gangen
f.eks ved:
string a;
a << MinKlasse1 << MinKlasse2;

Du erklærer en memberfunktion operator<<, som du aldrig implementerer.
den funktion du derimod laver er den globale funktion for operatoren<<.
hvis du skulle have lavet det med funktionen i klassen skulle din syntax jo
være noget
nær sådan her:
string& MinKlasseerator<<(.....

Men af nogle obskure grunde, er det vist fornuftigst at lave
implementationen som en global
funktion.. måske ikke lige i dette tilfælde, men ved operatorer som + og -
hvor man
forventer at de virker ens uanset hvilken rækkefølge du putter dine
argumenter ind i, giver det nogle problemer.

så jeg tror det smarte er at slette det erklæring i klassen, såvidt jeg kan
se, er den ihvertfald overflødig.

Jonas


"Jesper Gødvad" <Xesper@goedvad.dk> wrote in message
news:9g653t$8dm$1@sunsite.dk...
> Hej Alle.
>
> Jeg har lavet en overloaded funktion til min klasse
>
> class MinKlasse {
> string returStreng() { return "min tekst"; }
> friend string& operator <<( string&, const MinKlasse& );
> };
>
> string& operator<< (string& ud, const MinKlasse & kilde ) {
> ud += min_streng; // virker fint
> ud += fri_funktion( min_streng ); // virker også fint
> ud += kilde.returStreng(); // virker ikke
> }
>
> Resultatet er følgende kompileringsfejl under g++, RedHat Linux:
>
> parsing const MinKlasse' as 'this' argument of const string
> MinKlasse::returSteng() ' discards qualifiers
>
> Hvorfor kan jeg ikke kalde funktionen og hvad "betyder" fejl-meddelelsen?
>
> Håber nogen kan hjælpe.
>
> mvh. jesper
>
>



Ivan Johansen (13-06-2001)
Kommentar
Fra : Ivan Johansen


Dato : 13-06-01 00:42

Jonas Meyer Rasmussen wrote:
> Du erklærer en memberfunktion operator<<, som du aldrig implementerer.
> den funktion du derimod laver er den globale funktion for operatoren<<.
> hvis du skulle have lavet det med funktionen i klassen skulle din syntax jo
> være noget
> nær sådan her:
> string& MinKlasseerator<<(.....

Jeg kan ikke se nogen memberfunktion operator<<. Han skriver netop at
den er en friend og ikke et medlem af klassen. Men hvis han ikke bruger
nogen private data eller funktioner i klassen behøver den ikke være
friend, og denne erklæring kan slettes, som du ganske rigtigt påpeger.

> Men af nogle obskure grunde, er det vist fornuftigst at lave
> implementationen som en global
> funktion.. måske ikke lige i dette tilfælde, men ved operatorer som + og -
> hvor man
> forventer at de virker ens uanset hvilken rækkefølge du putter dine
> argumenter ind i, giver det nogle problemer.
Det er ikke obskure grunde. Da første parameter til operator<< er string
og ikke hans egen klasse, er funktionen nødt til at være global. Ellers
skulle funktionen være medlem af klassen string, som man ikke selv bør
redigere i.

> så jeg tror det smarte er at slette det erklæring i klassen, såvidt jeg kan
> se, er den ihvertfald overflødig.
Enig, hvis private eller protected data eller funktioner ikke anvendes.
Men da returStreng() her er private kan erkleringen ikke fjernes.

Venlig hilsen
Ivan Johansen

Ivan Johansen (13-06-2001)
Kommentar
Fra : Ivan Johansen


Dato : 13-06-01 00:56

"Jesper Gødvad" wrote:
> class MinKlasse {
> string returStreng() { return "min tekst"; }
> friend string& operator <<( string&, const MinKlasse& );
> };
>
> string& operator<< (string& ud, const MinKlasse & kilde ) {
> ud += min_streng; // virker fint
> ud += fri_funktion( min_streng ); // virker også fint
> ud += kilde.returStreng(); // virker ikke
> }
> parsing const MinKlasse' as 'this' argument of const string
> MinKlasse::returSteng() ' discards qualifiers

Den første fejl kan ganske rigtig være svær at forstå. Fejlen skyldes at
kilde er en konstant, som returStreng ikke må ændrer på. Dette gør den
heller ikke, men det ved compileren ikke. Dette kan du dog fortælle
compileren ved at skrive const efter funktionserklæringen:
string returStreng() const { return "min tekst"; };

Du bør rent faktisk altid skrive const efter funktionserklæringen på en
funktion, der ikke ændrer på klassens data.

Den anden fejl betyder at du har glemt at returnere noget fra
funktionen:
return ud;

Det undrer mig dog at du bruger operator<< til at lægge indeholdet af en
klasse til en streng. Jeg ville have anvendt operator+=, hvilket jeg
synes er mere logisk. operator<< bruges normalt til streaming.

Jeg håber det har hjulpet dig.

Ivan Johansen

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste