Archiv verlassen und diese Seite im Standarddesign anzeigen : Parameterübergabe bei Funktionsaufruf
Moin Boardis!
Habe eine simple Frage:
Kann man bei einem Funktionsaufruf bei der Parameterübergebe einen String 'direkt' übergeben und nicht per Variable?
Beispiel:
objektklasseA.funktioninklasseA("meinstringalsübergabe");
Compiler Info:
invalid conversion from `const char*' to `char'
Auszug aus hpp:
char funktioninklasseA(char variable);
Ist es das Problem, dass der Compiler einen einzigen Buchstaben erwartet (weil ich nur char schreibe anstatt char[100] wie bei einer Variableninitialisierung), was plappert der von Pointer? Gibts bei c++ auch sowas wie CString, wie bei vc++ .net? Dann würde das doch gehen!?
gruss
gery
p.s ist mein erster Versuch :o
peschmae
02-02-2005, 19:45
bei mir geht das hier (gcc 3.4):
#include <iostream>
void test(char* a) {
printf("%s\n", a);
}
int main (void) {
test("bla");
return 0;
}
und etwas mehr C++lerisch:
#include <iostream>
void test(std::string a) {
std::cout << a << std::endl;
}
int main (void) {
test("bla");
return 0;
}
MfG Peschmä
anda_skoa
02-02-2005, 21:35
besser
void test(const std::string& text)
{
}
Ojekte übergibt man am Besten als konstante Referenz, das erspart unnötige Kopiererei, ganz abgesehen von Klassen, die sich nicht kopieren lassen.
was plappert der von Pointer?
Ein Array kann auch als Pointer auf seinen Anfang dargestellt werden.
Ciao,
_
Achso, vielen Dank für diese Antworten, sie haben mir geholfen!
Aber wenn der g++ compiler std. mässig sagt, dass ich bei ca. 5 Buchstaben einen Pointer machen soll :/, was ist ,wenn ich diesen String mal kopieren möchte?
peschmae
03-02-2005, 07:30
Ojekte übergibt man am Besten als konstante Referenz, das erspart unnötige Kopiererei, ganz abgesehen von Klassen, die sich nicht kopieren lassen.
Tsts, da hat peschmae mal wieder einen Bock geschossen wie man so schön sagt :D
@gEry: Ich hab deine Frage nicht ganz verstanden. Könntest du die eventuell mal wiederholen?
MfG Peschmä
Also der Compiler will, dass ich ein Pointer mache (oder Referenz, was sich ja aussert in der Schreibweise nicht ändert) für zwei drei Buchstaben, dann kam von euch der Vorschlag, dass ich es in der hpp und bei der Funktion selber mit Pointer löse, sprich:
test(std::string& a)
{
}
Aber was ist, wenn ich gar keinen Pointer machen möchte, sondern die Buchstaben kopieren möchte? Das sollte ja laut Compiler nicht möglich sein, laut der Info:
invalid conversion from`const char*' to `char'
anda_skoa
03-02-2005, 11:25
Pointer und Referenz verhalten sich zwar fast gleich, sind aber verschiedene Sachen.
Bei einer Referenz kann man, abgesehen von Missbrauch, davon ausgehen, dass sie gültig ist, bei einem Pointer ist das nicht so.
Zu dem "Problem":
Für den C++ Compiler ist jede Zeichenkette unter Anführungszeichen eine Char Array Konstante, also ein const char*
Das ist jetzt aber kein Problem, denn std::string, also die Stringklasse der Standardbibliothek hat einen Konstruktor der diesen Datentyp als Parameter nimmt.
Man kann also eine std::string Instanz mit einem const char* initialisieren, zB
std::string s("test");
Wenn jetzt eine Funktion einen std::string bzw eine konstante Referenz davon erwartet, also so
void test(std::string s);
oder so
void test(const std::string& s);
aussieht, kann der C++ Kompiler implizit eine Konversion von const char* auf std::string machen, d.h. ein Aufruf wie
test("test");
wird einwandfrei kompiliert.
Der Compiler macht dazu intern in etwa
test(std::string("test"));
daraus.
Wenn man C++ programmiert packt man am Besten Zeichenketten immer in Stringklassen, also zB std::string und "vergisst" vorrübergehend auf das C-Erbe char* bis man es wirklich braucht, zB zur Übergabe an eine C API
Ciao,
_
peschmae
03-02-2005, 11:32
Wenn du den Code nimmst den ich oben gepostet habe wird der String kopiert:
test(std::string a) {
}
Wenn du nicht mit std::string arbeiten willst sondern mit chars musst du wohl oder übel "von hand" kopieren und der Funktion dann einen Pointer auf die Kopie übergeben.
MfG Peschmä
Ach so, ja, das wollte ich lesen! :D
Vielen Dank, damit hat sich mein besch. Wissen etwas erweitert!
(in meinem c++ Buch waren solche Infos nicht enthalten :mad: )
greEz
gEry
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.