Toon posts:

[eVC++] Cstring omzetten naar een std:string

Pagina: 1
Acties:
  • 403 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ben pas begonnen met C++ en nu bezig om een programma te schrijven om kilometers te registreren. Dit doe ik met MS embedded VC++ 4.0 om het te kunnen gebruiken op mijn PDA.

Eerst heb ik een klasse geschreven genaamd Trip waarin de informatie van een enkele trip staat. Deze trips neem ik op in een triplist wat een vector is waarin de trips worden opgeslagen. Ik heb om e.e.a. te testen dit eerste gedaan in een console applicatie. Mijn classe werkt en nu wilde ik in eVC een GUI koppelen aan mijn code.
Toen kwam echter het probleem de member variables uit het dialog venster kan ik alleen terug krijgen als een Cstring (of getallen zoals int). Bij het bouwen van mijn klasses heb gebruik gemaakt van std::string om deze de klasses ook in een niet MS compiler te kunnen gebruiken. Ik kan dus niet zomaar zeggen:

std::string = Cstring

Weet iemand hoe ik een Cstring kan omzetten naar een std::string. Ik zit al twee dagen te turen in google en de MSDN maar ik kan het niet vinden.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik kan dus niet zomaar zeggen:

std::string = Cstring
Waarom niet? CString heeft een operator const char*(), en std::string heeft een operator=(const char*). Zou dus gewoon moeten werken.

Tenzij je app unicode is, waardoor hij intern wchar_t's gebruikt ipv char's. Als dat zo is kun je 'm aan een std::wstring assignen, of je moet 'm converteren naar ANSI string.

Het is trouwens CString, niet Cstring

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Als ik probeer :

std::string test;
test = dlg.m_tripfrom;

Krijg ik:
Compiling...
TripAppDlg.cpp
C:\Program Files\Microsoft eMbedded C++ 4.0\Common\EVC\MyProjects\TripApp\TripAppDlg.cpp(81) : error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'class CString' (or there is no acceptable conversion)
Error executing cl.exe.

TripAppDlg.obj - 1 error(s), 0 warning(s)


Doe ik:

CString test;
test = dlg.m_tripfrom;

Dan geen probleem.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

En probeer eens
C++:
1
std::wstring test = dlg.m_tripfrom;

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Op de volgende site wat gevonden wat mijn probleem denk ik oplost.
http://www.pocketpcdn.com/articles/strings.html

Als ik dit invoeg kan ik unicode omzetten naar Ansi.

CString s;
int nSize = s.GetLength();
char *pAnsiString = new char[nSize+1];
wcstombs(pAnsiString, s, nSize+1);

Ik voeg gewoon een functie in die de conversie uitvoert. Zo kan ik mijn klasses ongewijzigd gebruiken.
Het programma wordt niet erg groot dus veel performance problemen verwacht ik niet met de conversies.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Als je toch intern geen wchar gebruikt waarom compileer je em dan als unicode? Neem dan gewoon ANSI, dan heb je dit probleem ook niet.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik denk dat andersom handiger is, ANSI moet gewoon sterven op het Windows platform, en ik vraag me af of Windows Mobile e.d. überhaupt ANSI varianten van de win32 API functies bieden. Gebruik dus gewoon std::wstring.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Windows CE heeft volgens de genoemde website alleen unicode dus een keuze voor ansi kan dus niet.
Ik gebruik de conversie omdat is al code klaar heb (die eindelijk werkt) die gebruik maakt van string.h.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
.oisyn schreef op woensdag 06 juni 2007 @ 21:58:
[...]
Waarom niet? CString heeft een operator const char*(), en std::string heeft een operator=(const char*).
Dat zijn twee conversies. Als de compiler voor elke conversie van A naar B alle mogelijk interim types T1..Tn zou moeten overwegen (inclusief templated types) dan is de snelheid en voorspelbaarheid te laag. Eén expliciete conversie lost het probleem op; welke dat is maakt niet uit.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee, het is er 1.
C++:
1
2
3
CString a;
std::string b;
b = a;


b = a is natuurlijk b.operator=(a). string::operator=() heeft een aantal overloads. Een daarvan is operator=(const char*). CString heeft een conversion operator naar const char*, dus de uiteindelijke aanroep wordt
C++:
1
b.operator=(a.operator const char*());


1 conversie (die van CString naar const char*), niet 2 (als string::operator=(const char*) niet zou bestaan had je een punt).

[ Voor 6% gewijzigd door .oisyn op 07-06-2007 21:16 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1