/ 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
atoi af cstring (MFC)
Fra : Troels Thomsen


Dato : 20-06-03 13:51

Hej,

CString asdf = "123"
int a = atoi ( asdf );

Kræver det ikke en overloaded version af atoi
int atoi(const cstring& str) ... måske?

Jeg har ledt alle .h filer igennem på min hd men denne prototype findes
ikke, og alligevel kompilerer det, og virker tilsyneladende !!!
Eller er der noget automatisk cstring til char* konvertering (promotion
aktigt) der er i spil ??

mvh Troels



 
 
Bertel Brander (20-06-2003)
Kommentar
Fra : Bertel Brander


Dato : 20-06-03 14:44

Troels Thomsen wrote:
> Hej,
>
> CString asdf = "123"
> int a = atoi ( asdf );
>
> Kræver det ikke en overloaded version af atoi
> int atoi(const cstring& str) ... måske?
>
> Jeg har ledt alle .h filer igennem på min hd men denne prototype findes
> ikke, og alligevel kompilerer det, og virker tilsyneladende !!!
> Eller er der noget automatisk cstring til char* konvertering (promotion
> aktigt) der er i spil ??
>

Der er automatisk konvertering fra en CString til en const char *

Så du kan også:

CString cs = "whatever";
char c[1024];
strcpy(c, cs);

Men du kan ikke:

strcpy(cs, c);

Hvis du bruger CString som argument til *printf(...) skal du
dog lave en cast.

Alt dette skyldes at CString klassen har en operator:

operator LPCTSTR ( ) const;

/b

--
Bertel Brander, author of Wain, a free text editor for programmes:
http://home20.inet.tele.dk/midgaard/program.htm


Troels Thomsen (20-06-2003)
Kommentar
Fra : Troels Thomsen


Dato : 20-06-03 15:41


Tak
Og den funktion må så blive kaldt inden kaldet til atoi,
det må man kunne se i disassembly,
yeps:

289: int a = atoi (sdf);
004026C6 lea ecx,[ebp-14h]
004026C9 call CString:erator char const * (00402224)
004026CE mov esi,esp
etc
etc


> operator LPCTSTR ( ) const;
>
Hvad er det nu const til sidst betyder?

tpt




Bertel Brander (20-06-2003)
Kommentar
Fra : Bertel Brander


Dato : 20-06-03 18:14

Troels Thomsen wrote:
> Tak
> Og den funktion må så blive kaldt inden kaldet til atoi,
> det må man kunne se i disassembly,
> yeps:
>
> 289: int a = atoi (sdf);
> 004026C6 lea ecx,[ebp-14h]
> 004026C9 call CString:erator char const * (00402224)
> 004026CE mov esi,esp
> etc
> etc
>
>
>
>>operator LPCTSTR ( ) const;
>>
>
> Hvad er det nu const til sidst betyder?
>
const til sidst betyder blot at operatoren ikke modificerer
det objekt den er kaldt med, så vidt jeg ved har det kun
betydning for optimering.

/b


Troels Thomsen (24-06-2003)
Kommentar
Fra : Troels Thomsen


Dato : 24-06-03 17:18


> > int atoi(const cstring& str)
> operator LPCTSTR ( ) const;

Det slog mig lige : Hvis begge ting findes, hvad vælger compileren så?
(Det kunne jeg jo finde ud af ved at prøve, så spørgsmålet er nok nærmere:
hvorfor ? )

mvh Troels




Bertel Brander (24-06-2003)
Kommentar
Fra : Bertel Brander


Dato : 24-06-03 23:01

Troels Thomsen wrote:

>>>int atoi(const cstring& str)
>>
>>operator LPCTSTR ( ) const;
>
>
> Det slog mig lige : Hvis begge ting findes, hvad vælger compileren så?
> (Det kunne jeg jo finde ud af ved at prøve, så spørgsmålet er nok nærmere:
> hvorfor ? )

Jeg ved ikke ret meget om C++, så jeg satte mig for at prøve det:

#include <afx.h>

void my_func(CString &ref)
{
printf("Called ref: %s\n", (const char *)ref);
}

void my_func(const char *ref)
{
printf("Called pointer: %s\n", ref);
}

int main(void)
{
CString test = "WhatEver";
my_func(test);
return 0;
}

Den valgte at kalde "void my_func(CString &ref)", jeg har ingen ide om
hvorfor.

/b


Ivan Johansen (25-06-2003)
Kommentar
Fra : Ivan Johansen


Dato : 25-06-03 07:19

Bertel Brander wrote:
> Den valgte at kalde "void my_func(CString &ref)", jeg har ingen ide om
> hvorfor.

Fordi den passer perfekt, mens der skal laves en konvertering for at
kalde my_func(const char*).

Det samme sker her:
void f(int);
void f(char);

int i = 0;
f(i);

Her kaldes f(int) fordi den passer perfekt. Hvis f(int) ikke var der
ville den kalde f(char).

Ivan Johansen


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

Månedens bedste
Årets bedste
Sidste års bedste