Pointer Verständnisfrage

Thomasio

Erfahrenes Mitglied
Ich habe da eine Sache, die funktioniert ohne Probleme, ich wüsste nur gerne warum, denn soweit ich die Erklärung dazu verstanden habe dürfte es eigentlich nicht funktionieren.
Das Ganze stammt aus einem Code-Schnipsel, was ich irgendwo zu WinInet aufgegabelt habe und soll einen string via HTTP and eine URL senden.

Code:
string ToSend = "SomeText";

HINTERNET ..... // connection mit flags und zeug lasse ich mal weg

HttpSendRequest(request, "Content-Type: application/x-www-form-urlencoded", 47, (void*)ToSend.c_str(), ToSend.size());

Ich habe es ausprobiert, das funktioniert, aber jetzt die dumme Frage:
WIESO kann ich einfach (void*) vor den string setzen?
Ganz ohne @ oder sonstwas, das darf doch gar nicht funktionieren, oder wie?
 
Ich habe es ausprobiert, das funktioniert, aber jetzt die dumme Frage:
WIESO kann ich einfach (void*) vor den string setzen?
Mit C-Style-Casts kannst du Pointer beliebig uminterpretieren (hier von const char * zu void *).

Ganz ohne @ oder sonstwas, das darf doch gar nicht funktionieren, oder wie?
@ ist in C kein Operator, bin mir also nicht ganz sicher was du damit meinst. Wieso sollte es denn nicht funktionieren?

Grüße, Matthias
 
Das sollte nicht funktionieren, weil ToSend kein Pointer ist, und ich ja nicht string zu pointer casten kann.
Aber nachdem ich jetzt nochmal genauer hin schaue, fällt mir auch auf, dass .c_str() hier ein char* zurück gibt, und dann ist mir auch klar, dass ich das zu void* casten kann.

Danke für die Erleuchtung.
 
Das sollte nicht funktionieren, weil ToSend kein Pointer ist, und ich ja nicht string zu pointer casten kann.
std::string kann man nicht so ohne weiteres in einen Pointer casten, aber generell kann eine C++-Klasse eigene Cast-Operatoren definieren. Beispiel:
C++:
#include <string>
#include <iostream>

class CharPtrObject {
 public:
  CharPtrObject(char *data) : data_(data) {}

  // Operator für (void *)-Cast
  operator void *() { return (void *)data_; }  
  // Operator für string-Cast
  operator std::string() { return std::string(data_); }

 private:
  char *data_;
};

int main(void) {
  char str[] = "tutorials.de";
  CharPtrObject cpo(str);
  void *ptr = cpo; // Impliziter Aufruf des (void *)-Cast-Operators
  std::cout << (std::string)cpo; // Expliziter Cast zu std::string
}
Die Begründung, warum (void *)str nicht funktioniert, sollte als nicht sein: "ein Objekt kann man nicht in einen Pointer casten", sondern "std::string besitzt keine Überladung für operator void *".

Grüße, Matthias
 

Neue Beiträge

Zurück