PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] lokale variable als Rueckgabewert



nul
20-10-2005, 23:16
Ich schreib mir gerade an einer Methode, die mir einen Client akzeptiert und eine Struktur auf gewisse Daten zuruecklifern soll. Und zwar sieht das so aus:

const client_str*
Connection::accept_client()
{
client_str client_addr;
socklen_t len = sizeof( client_addr.cli_addr );
struct sockaddr* ca = (struct sockaddr*)&client_addr.cli_addr;

client_addr.client = accept( this->server_socket, ca, &len );

if ( client_addr.client == -1 )
{
std::cerr << "Error accepting client!" << std::endl
<< this->class_error << "accept_client()" << std::endl;
return NULL;
}
else
{
return &client_addr;
}
}
Nun ist ja die Variable client_addr lokal. Kann ich das irgendwie verhindern, dass die Variable spaeter auch ausserhalb der Methode sichtbar ist. Soviel ich weis werden in einer Methode angelegte Variablen ja nach der Ausfuehrung der Methode geloescht.
Eine Klassenvariable moechte ich nicht unbedingt anlegen, dehalb, hat jemand vielleicht eine Idee .....

Bin wie immer fuer jeden Tipp und anregenden Gedanken dankbar!

mfg

BLUESCREEN3D
21-10-2005, 01:06
(...) Methode, die mir einen Client akzeptiert und eine Struktur auf gewisse Daten zuruecklifern soll. (...)
Kann ich das irgendwie verhindern, dass die Variable spaeter auch ausserhalb der Methode sichtbar ist.
Du willst die Variable zurückgeben aber gleichzeitig soll sie nicht außerhalb der Funktion sichtbar sein? Das widerspricht sich irgendwie...


Soviel ich weis werden in einer Methode angelegte Variablen ja nach der Ausfuehrung der Methode geloescht.
Und genau deshalb geht das, was du da an Code gepostet hast, schonmal nicht, weil du die Adresse zu der Variablen zurückgibst, die im nächsten Moment quasi nicht mehr existiert...

nul
21-10-2005, 02:01
Dann ueberleg ich mir dazu was anderes, hab mir wie gesagt schon gedacht, dass das nicht geht. Trotzdem vielen dank!

anda_skoa
21-10-2005, 16:38
Du kannst natürlich auch client_addr am Heap anlegen und im Fehlerfall löschen.

Bzw bei Erfolg in einen neue Instanz am Heap kopieren.

Ciao,
_

RapidMax
21-10-2005, 17:25
Prinzipiell kann auch das struct als Kopie zurückgegeben werden. Vorsicht ist immer dann geboten, wenn Pointer auf dynamisch allozierten Speicher enthalten sind und der Copy-Contstructor diese nicht mit kopiert.

client_str
Connection::accept_client()
{
client_str client_addr;
[...]
return client_addr;
}

Gruss, Andy