Problem mit operator=()

cesupa

Erfahrenes Mitglied
Hallo,

ich bin jetzt schon langsam am Verzweifeln. Ich versuche gerade eine LPVOID Variable an eine von mir gemachte Strukur zu übergeben. Nur hab ich irgendwie ein Problem mit dem = operator :rolleyes: .
Folgenden Code hab ich mir versuchsweise zusammengebastelt:

Code:
class test1{
       public:
       test1();
       ~test1();     
       int a;
       int b;
       test1 test1::operator=(const test1& neu)
       {
             test1 t;
             t.a=neu.a;
             t.b=neu.b;
             return t;
             }
      
       };

int test_func(LPVOID t)
{
    test1 t2;
    t2=t;
    return 0;
}

int main(int argc, char *argv[])
{
    test1 s;
    s.a=5;
    s.b=3;
    test_func(s);
    system("PAUSE");
    return EXIT_SUCCESS;
}

Kann sein das ich da totalen Schrott gemacht habe, aber darum frag ich ja euch. Ich hab irgendwie den Durchblick verloren :(

Hoffe ihr könnt mir helfen.

Gruß
cesupa
 
A) Dein operator= macht nicht wirklich, was er eigentlich sollte und
B) ein LPVOID ist nur ein LPVOID, du musst dem Compiler schon sagen, wie er da draus ein test1 machen soll.

A)

Der sollte so aussehen:

Code:
test1& test1::operator=(const test1& neu)
{
  a = neu.a;
  b = neu.b;

  return *this;
}

Bei einer solchen Klasse benötigst du aber keinen selbst erzeugten operator=, da reicht die vom Compiler automatisch erzeugte Version.

B) Ich vermute mal, das LPVOID (ist ja nur ein void*) ist ein Pointer auf ein test1 enthalten, alles andere wäre völliger Quatsch:

Code:
int test_func(LPVOID t)
{
    test1 t2;

    t2 = *(test1*)t;
    return 0;
}
 
Nur hab ich irgendwie ein Problem mit dem = operator :rolleyes: .

Ich finde es ja immer wieder schön das man erfahrenen Programmierern die Fähigkeit des Gedankenlesens zuspricht, aber ich muß dich enttäuschen, keiner von uns kann sich unter "irgendwie ein Problem" etwas zusammenreimen. Hilfreich dagegen wäre es, wenn Du das "irgendwie Problem" einfach mal beschreiben würdest. (Ist es jetzt ein Compilerproblem, ein Laufzeitproblem, ein Absturz, ein Linkerproblem oder läuft zwar alles, aber das Ergebnis stimmt nicht usw...)


Kann sein das ich da totalen Schrott gemacht habe,
Kurzantwort: Stimmt.

Langantwort:

1. Du benutzt einen void* (LPVOID) als Parameter für Deine Testroutine:


int test_func(LPVOID t)


Demnach müsstest Du der Routine eine Adresse übergeben. Machst Du aber nicht:

test1 s;
test_func(s);

Das müsste heissen:

test_func(&s);

Das hier keine Fehlermeldung kommt liegt einfach daran, das void* auf alles passt.



2. Die Zuweiseung selbst in der Testfunktion hat gleich mehrere Fehler:

t2=t;

a) t ist ein void*. Du weist also eine Adresse dem Objekt t2 zu. Wenn überhaupt, müßte das heissen t2=*t;

b) t ist aber ein void*, hat also keine Klasseninformationen. void* ist einfach nur eine Adresse im Speicher, mehr nicht. Daher kann Dein Zuweisungsoperator gar nicht funktionieren, weil der ja nicht einen void* erwartet, sondern ein Objekt vom Typ test1

Zwei mögliche Lösungsansätze:

t2= *((test1*)t); // oder passen dynamic_cast, static_cast etc

Passenden operator= schreiben der einen void* erwartet.



Prinzipiell stellt sich die Frage nach dem Warum. Wozu einen void* benutzen? Damit öffnest Du vielen Problemen die Tür. Wenn Du später z.B. einmal ein falsches Objekt übergibst "funktioniert" der Code zwar, wird aber garantiert zu schwer auffindbaren Fehlern führen. void* als Parameterübergabe in C++ sollte die absolute Ausnahme sein, nicht die Regel.
 
Dankeschön, hat funktioniert. Vielleicht sollte ich mal wieder mein Anfänger-C++ Buch konsultieren ;) .

Gruß
cesupa
 
Zurück