Du bist nicht eingeloggt.

Login

Pass

Registrieren

Community
Szene & News
Locations
Impressum

Forum / Bits und Bytes

C++ Anfänger Verständnisfrage zu CString

Caarcrinolas - 41
Profi (offline)

Dabei seit 02.2006
909 Beiträge

Geschrieben am: 11.09.2006 um 23:59 Uhr

Hallo,

ich entwickle seit ein paar Wochen mit C++, unterstützt durch Bücher, Vorkenntnisse und Erfahrungen durch andere Sprachen.

Situation:
- Arbeiten mit der MFC

Ich habe in einer Header Datei u.A. zwei CString Variabeln definiert, welche ich in Methode A mit Werten füttere. Anschließend versuche ich mit diesen Werten in Methode B weiterzubearbeiten.

Dabei stellte sich heraus, dass die Variablen leer sind. Diese Problemmatik konnte ich mir erklären, da es sich bei CString um eine Klasse der MFC handelt und im Grunde keinem Datentyp entspricht. Diese Klasse stellt u.A. effiktivere Möglichkeiten bereit um mit Strings zu arbeiten, so wie man es bei VB gewohnt ist.

Dadurch das es sich um eine Klasse handelt, erzeugt der Aufruf der selbigen sowohl ein CString Object in Methode A als auch in Methode B.
Daher hat auch der Compiler keinen Grund einen Syntaxfehler zu bemängeln.

Meine Frage ist daher relativ simpel, wie gelange ich an das Object bzw. die Klasseninstanz von Methode A um mit dieser weiterarbeiten zu können?

Aristoteles: "Es gibt kein großes Genie ohne einen Schuß Verrücktheit."

JY12 - 39
Fortgeschrittener (offline)

Dabei seit 01.2005
61 Beiträge
Geschrieben am: 23.10.2007 um 16:52 Uhr

Zitat von Caarcrinolas:

Hallo,

ich entwickle seit ein paar Wochen mit C++, unterstützt durch Bücher, Vorkenntnisse und Erfahrungen durch andere Sprachen.

Situation:
- Arbeiten mit der MFC

Ich habe in einer Header Datei u.A. zwei CString Variabeln definiert, welche ich in Methode A mit Werten füttere. Anschließend versuche ich mit diesen Werten in Methode B weiterzubearbeiten.

Dabei stellte sich heraus, dass die Variablen leer sind. Diese Problemmatik konnte ich mir erklären, da es sich bei CString um eine Klasse der MFC handelt und im Grunde keinem Datentyp entspricht. Diese Klasse stellt u.A. effiktivere Möglichkeiten bereit um mit Strings zu arbeiten, so wie man es bei VB gewohnt ist.

Dadurch das es sich um eine Klasse handelt, erzeugt der Aufruf der selbigen sowohl ein CString Object in Methode A als auch in Methode B.
Daher hat auch der Compiler keinen Grund einen Syntaxfehler zu bemängeln.

Meine Frage ist daher relativ simpel, wie gelange ich an das Object bzw. die Klasseninstanz von Methode A um mit dieser weiterarbeiten zu können?


ich glaub du brauchst dich net wundern das du da keine antwort bekommen hast.... ich blicknix he!

Stop the Jammer beginn to kämpf

McPommes - 51
Experte (offline)

Dabei seit 09.2006
1422 Beiträge
Geschrieben am: 23.10.2007 um 17:56 Uhr

A bissle was hätte man schon dazu sagen können. Z.B. fragen wie die Variablen angelegt und gefüllt werden. Aber inzwischen hat sich das sicher schon erledigt.


*** diese Fusszeile verschwendet 45 Bytes ***

Polaris
Experte (offline)

Dabei seit 07.2006
1766 Beiträge
Geschrieben am: 23.10.2007 um 22:07 Uhr
Zuletzt editiert am: 24.10.2007 um 20:38 Uhr

Zitat von Caarcrinolas:


Situation:
- Arbeiten mit der MFC

Ich habe in einer Header Datei u.A. zwei CString Variabeln definiert, welche ich in Methode A mit Werten füttere. Anschließend versuche ich mit diesen Werten in Methode B weiterzubearbeiten.

definiert oder nur deklariert? - Eine Definition sollte, wenn möglich immer in Sourcedateien liegen.

Zitat:


Dabei stellte sich heraus, dass die Variablen leer sind. Diese Problemmatik konnte ich mir erklären, da es sich bei CString um eine Klasse der MFC handelt und im Grunde keinem Datentyp entspricht. Diese Klasse stellt u.A. effiktivere Möglichkeiten bereit um mit Strings zu arbeiten, so wie man es bei VB gewohnt ist.

was meinst du mit leer? könnte es sein, dass es tatsächlich - beabsichtigt oder nicht nur Deklarationen sind? (hier sollte der Linker allerdings einen Fehler melden)

Zitat:

Dadurch das es sich um eine Klasse handelt, erzeugt der Aufruf der selbigen sowohl ein CString Object in Methode A als auch in Methode B.
Daher hat auch der Compiler keinen Grund einen Syntaxfehler zu bemängeln.

Also liegen deine CString-Objekte in einer Klasse? Dann wird, wenn die Klasse instanziert wird, der Defaultkonstruktor der CStrings aufgerufen (sofern dein Konstruktor nix anderes festlegt), das würde auch erklären, warum die Strings leer sind.

Zitat:

Meine Frage ist daher relativ simpel, wie gelange ich an das Object bzw. die Klasseninstanz von Methode A um mit dieser weiterarbeiten zu können?

na ja, ich weiß nicht, wie bei dir das "Design" deines Programms aussieht.
Du könntest anstatt in der Methode zu instanzieren beispielsweise, einen Parameter als Referenz auf ein Objekt dieser Klasse machen, diesem Parameter dann das Objekt übergeben und anschließend damit weiterarbeiten.
Du könntest es auch in der Klasse dynamisch per new erzeugen und nen Pointer darauf zurückgeben (musst halt dafür sorgen, dass es wieder ordnungsgemäß per delete zerstört wird), hier würde sich übrigens std::auto_ptr sehr anbieten.

also codemäßig in etwa so (also T steht als Platzhalter für deinen Typ, also CString meinetwegen):

std::auto_ptr<T> MethodeA(/*Parameter*/) {
std::auto_ptr<T> mObj (new T(/*Konstruktoraufruf*/));

// blablabla

return mObj; /*auto_ptr stellt sicher, dass immer nur ein auto_ptr in einem Moment auf ein Objekt zeigt und übernimmt die Zerstörung des Objekts beim verlassen des Gültigkeitsbereichs */
}

und aufrufen:

std::auto_ptr<T> p = MethodeA(/*Parameter*/);
//und dann mit p weiterarbeiten.

Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)

spark82 - 43
Halbprofi (offline)

Dabei seit 11.2006
240 Beiträge

Geschrieben am: 24.10.2007 um 16:00 Uhr

also mit einem Beispiel wär das Problem einfacher zu erklären und ggfls zu beantworten.

Zitat von Caarcrinolas:


Dabei stellte sich heraus, dass die Variablen leer sind. Diese Problemmatik konnte ich mir erklären, da es sich bei CString um eine Klasse der MFC handelt und im Grunde keinem Datentyp entspricht. Diese Klasse stellt u.A. effiktivere Möglichkeiten bereit um mit Strings zu arbeiten, so wie man es bei VB gewohnt ist.


Ein CString ist keine Klasse sondern ein Pointer auf ein Feld von Charaktern. So sollte es gehen:

####header.h######
char pMyCSstring[256];
#################
####test.c#########
void A()
{
pMyCString = "Hello World!";
}

void B()
{
cout << pMyCString << endl;
}
##################

Das ist aber eigentlich ein C-Problem. Mit C++ lässt sich das sauberer mit std::string lösen.

Das schlimmste an Zensur ist XXXXXXXX XXXXXX.

Polaris
Experte (offline)

Dabei seit 07.2006
1766 Beiträge
Geschrieben am: 24.10.2007 um 20:44 Uhr
Zuletzt editiert am: 24.10.2007 um 21:47 Uhr

Wir sind hier aber in C++ und nicht in C und daher ist das leider absolut falsch ;-), wir reden hier nämlich nicht von C-Strings, sondern von der Klasse "CString" der ATL/MFC von Microsoft. Das ist im Prinzip der MFC-Pendant zu std::string und ebenfalls eine vollwertige Stringklasse.

(BTW: Seit wann bitte gibt es cout in C? )

Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)

spark82 - 43
Halbprofi (offline)

Dabei seit 11.2006
240 Beiträge

Geschrieben am: 25.10.2007 um 11:28 Uhr

ok, dann hab ich was verwechselt. Hab gedacht er meint... cstrings eben. Dass es eine gleichnamige Klasse gibt wusste ich gar nicht. ;-)

Kleine Frage nebenbei: warum keine std::string verwenden? Ich glaube die sind weiter verbreitet, von wegen Portierbarkeit und so...

@Polaris: Hab versucht mich in C++ zu halten, in Gedanken hatte ich schon printf stehen :-)

Das schlimmste an Zensur ist XXXXXXXX XXXXXX.

Polaris
Experte (offline)

Dabei seit 07.2006
1766 Beiträge
Geschrieben am: 25.10.2007 um 18:24 Uhr

Na ja, ich denke es lohnt sich hier in der MFC mit CString zu arbeiten.
Sehr viel basiert hier ja auf den eigenen Klassen - so vermeidet man wahrscheinlich in dem Fall ne Menge Doppelkonvertierungen. (schätz ich mal ;-) )

Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)

bassmaster - 48
Profi (offline)

Dabei seit 10.2004
631 Beiträge

Geschrieben am: 10.11.2007 um 23:07 Uhr

Zitat von spark82:

also mit einem Beispiel wär das Problem einfacher zu erklären und ggfls zu beantworten.

Zitat von Caarcrinolas:


Dabei stellte sich heraus, dass die Variablen leer sind. Diese Problemmatik konnte ich mir erklären, da es sich bei CString um eine Klasse der MFC handelt und im Grunde keinem Datentyp entspricht. Diese Klasse stellt u.A. effiktivere Möglichkeiten bereit um mit Strings zu arbeiten, so wie man es bei VB gewohnt ist.


Ein CString ist keine Klasse sondern ein Pointer auf ein Feld von Charaktern. So sollte es gehen:

####header.h######
char pMyCSstring[256];
#################
####test.c#########
void A()
{
pMyCString = "Hello World!";
}

void B()
{
cout << pMyCString << endl;
}
##################

Das ist aber eigentlich ein C-Problem. Mit C++ lässt sich das sauberer mit std::string lösen.


wenn du so programmierst, dann gute nacht.
du reservierst 256 bytes (initialisierst sie nichtmal)

dann änderst du den pointer auf die constante "Hello world" -> die 256 bytes wären für immer weg...

wenn du dann später auf die gloreiche idee kommst die 256 bytes zu beschreiben mit

strcpy(pMyCString,"das ist ein super langer text - aber nicht länger als 256 bytes lang");

dann wirst du feststellen, dass du an der falschen adresse die 11 bytes überschreibst und sogar noch programmcode überschreibst. das programm wird früher oder später abstürzen...

ein buffer undderrun problem im hello world programm. ich dachte das würde es nie geben. hoffentlich programmierst du nicht lange programme...

####header.h######
char pMyCSstring[256];
#################
####test.c#########
void A()
{
strncpy(pMyCSstring,"hallo world",sizeof(pMyCSstring) - 1);

}

void B()
{
cout << pMyCString << endl;
}
##################


aber wie andere schon vorher gesagt haben: CString ist in der mfc eine vollwertige stringklasse mit automatischen speichermanagement....

http://www.impala64.de/blog - http://www.impala64.de/ - www.myspace.com/impala64lowrider

bassmaster - 48
Profi (offline)

Dabei seit 10.2004
631 Beiträge

Geschrieben am: 10.11.2007 um 23:11 Uhr

Zitat von Polaris:

Na ja, ich denke es lohnt sich hier in der MFC mit CString zu arbeiten.
Sehr viel basiert hier ja auf den eigenen Klassen - so vermeidet man wahrscheinlich in dem Fall ne Menge Doppelkonvertierungen. (schätz ich mal ;-) )


konvertiert wird nichts (außer du verwendet unicode / widechar und zurück)...
problem wird sein, wenn du die std strings verwendest, mit mfc klassen, dass du immer doppelt so viel speicherplatz brauchst. da immer gecastet wird und cstring erstellt dabei einen neuen string...


http://www.impala64.de/blog - http://www.impala64.de/ - www.myspace.com/impala64lowrider

bassmaster - 48
Profi (offline)

Dabei seit 10.2004
631 Beiträge

Geschrieben am: 10.11.2007 um 23:15 Uhr

poste doch mal den quellcode. ich denke, dass wir dir dann mehr helfen können.


http://www.impala64.de/blog - http://www.impala64.de/ - www.myspace.com/impala64lowrider

Polaris
Experte (offline)

Dabei seit 07.2006
1766 Beiträge
Geschrieben am: 11.11.2007 um 01:18 Uhr
Zuletzt editiert am: 11.11.2007 um 01:28 Uhr

Zitat von bassmaster:


problem wird sein, wenn du die std strings verwendest, mit mfc klassen, dass du immer doppelt so viel speicherplatz brauchst. da immer gecastet wird und cstring erstellt dabei einen neuen string...

genau das meinte ich mit den Konvertierungen, hast Recht, casts wäre das richtige Wort hier ;-)

Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)

  [Antwort schreiben]

Forum / Bits und Bytes

(c) 1999 - 2026 team-ulm.de - all rights reserved - hosted by ibTEC Team-Ulm

- Presse - Blog - Historie - Partner - Nutzungsbedingungen - Datenschutzerklärung - Jugendschutz -