/ 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
Overloaded operator?
Fra : Klaus Petersen


Dato : 24-11-04 22:10

Hej.

Jeg forsøger at overloade en assignment operator, men det vil ikke lykkes
for mig:

#include <stdio.h>

class test
{
public:

const test* operator= ( test* t )
{
printf ( "overloaded\n");
};
};

int main(int argc, char* argv[] )
{
test* t = new test ();

return 0;
}

Hvad gør jeg galt?

mvh.
Klaus



 
 
Bertel Brander (24-11-2004)
Kommentar
Fra : Bertel Brander


Dato : 24-11-04 22:43

Klaus Petersen wrote:
> Hej.
>
> Jeg forsøger at overloade en assignment operator, men det vil ikke lykkes
> for mig:
>
> #include <stdio.h>
>
> class test
> {
> public:
>
> const test* operator= ( test* t )
> {
> printf ( "overloaded\n");
> };
> };
>
> int main(int argc, char* argv[] )
> {
> test* t = new test ();
>
> return 0;
> }
>
> Hvad gør jeg galt?
>

Din assignment er ikke til et object af type test
men til en pointer til test.

Jeg har udvidet dit program lidt, i det sidste tilfælde
bliver din assignment kaldt.

Jeg ved ikke om man kan lave en operator der bliver
kaldt i dit tilfælde.

#include <stdio.h>

class test
{
public:
test()
{
printf("default\n");
}
test(const test *t)
{
printf ( "overloaded 2\n");
}
const test* operator= ( test* t )
{
printf ( "overloaded\n");
return this;
};
};

int main(int argc, char* argv[] )
{
test* t = new test ();

test t2 = new test();

test t3;
t3 = new test();
return 0;
}

--
"I learned more from a three minute record
than I ever learned in school"
- Bruce Springsteen

Mogens Hansen (25-11-2004)
Kommentar
Fra : Mogens Hansen


Dato : 25-11-04 18:51


"Klaus Petersen" <ng@spectual.ra.bnaa.dk> wrote in message
news:41a4f8b5$0$84102$14726298@news.sunsite.dk...

[8<8<8<]
> #include <stdio.h>

Ikke anbefalet (depricated) i C++.

Brug
#include <cstdio>
eller endnu bedre
#include <iostream>
i stedet.


[8<8<8<]
> Hvad gør jeg galt?

Med mindre at du ønsker at opnå noget meget specielt, og ikke blot en
"almindelig" copy-assignment, så er dit problem at du bruger pointere i
stedet for referencer.
Desuden blander du lidt rundt på hvor der skal stå "const".
Signaturen på copy-assignment er
class T
{
// ...
T& operator=(const T& rhs)
{
// whatever
return *this;
}
// ...
};

"const" lover at "rhs" (right hand side) ikke bliver ændret ved at tildele
den _værdi_ til et andet objekt.
Ved at returnere en T& kan man sætte flere tildelinger sammen:
T t1(1), t2(2), t3(3);
t1 = t2 = t3;
Ved at returnere ikke const reference, holder du samme krav som assignment
operatoren selv stiller.

Se eventuelt
The C++ Programming Language, Special Edition
Bjarne Stroustrup
ISBN 0-201-70073-5
side 246 og 945 for yderligere information.

Dit eksempel bliver så:
#include <iostream>

class test
{
public:
test(int i_arg) :
i(i_arg) {}

test& operator=( const test& rhs )
{
std::cout << "assignment: " << i << "=" << rhs.i << std::endl;
i = rhs.i;
return *this;
}

private:
int i;
};

int main()
{
test t1(1), t2(2), t3(3);
t1 = t2 = t3;
}


Så slipper du samtidig af med brug af new i eksemplet, og det hele bliver
præcis som at bruge en integer
Af nysgerrighed: har du lært Java eller C# først (siden du i et så lille
eksempel bruger pointe og new) ?

Venlig hilsen

Mogens Hansen




Mogens Hansen (27-11-2004)
Kommentar
Fra : Mogens Hansen


Dato : 27-11-04 16:35


"Klaus Petersen" <ng@spectual.ra.bnaa.dk> wrote in message
news:41a4f8b5$0$84102$14726298@news.sunsite.dk...
> Hej.
>
> Jeg forsøger at overloade en assignment operator, men det vil ikke lykkes
> for mig:

Husk iøvrigt at hvis man har brug for selv at implementere copy-assignment,
så har typisk også brug for selv at implementere copy-constructor og
destructor.

Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177452
Tips : 31962
Nyheder : 719565
Indlæg : 6408137
Brugere : 218879

Månedens bedste
Årets bedste
Sidste års bedste