PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Parameterübergabe bei Funktionsaufruf



gEry
02-02-2005, 18:50
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,
_

gEry
03-02-2005, 06:39
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ä

gEry
03-02-2005, 09:16
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ä

gEry
03-02-2005, 11:37
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