Klasse mit Zeigern benutzen
-
Guten Abend!
Ich habe folgendes Problem: Ich habe für mein Projekt eine Klasse (chemische Reaktion) angelegt, die mit den Zeigern einer anderen Klasse (chemische Substanz) arbeiten soll. Ich will mit den Zeigern erreichen, dass ich beliebig viele Reaktionen mit beliebigen Substanzen berechnen kann. Dazu muss beim Initialisieren einer Reaktion (z.B. 1 Edukt, 1 Produkt) der Zeiger des Produkts und der des Edukts abhängig von der Position beim Initialisieren gespeichert werden. Jedoch habe ich beim Initialisieren einer Reaktion das Problem, dass Unabhängig von der Art der Initialisierung das gleiche Ergebnis kriege. Anbei der Minimalcode mit Integerzeigern.#include <iostream> using namespace std; class intp{ int *a; int *b; public: void set_intp(int A, int B); void print_pA(); void print_pB(); }; void intp::print_pA(){ cout << a << endl; } void intp::print_pB(){ cout << b << endl; } void intp::set_intp(int A, int B){ a = &A; b = &B; } int main(int argc, const char * argv[]) { int X= 1; int Y= 2; intp point1; intp point2; point1.set_intp(X, Y); point2.set_intp(Y, X); point1.print_pA(); point1.print_pB(); point2.print_pA(); point2.print_pB(); return 0; }Ergebnis:
0x7fff5fbff7a4
0x7fff5fbff7a0
0x7fff5fbff7a4
0x7fff5fbff7a0Ich würde jedoch folgendes Erwarten wenn X in 0x7fff5fbff7a4 und Y in 0x7fff5fbff7a0 gespeichert ist:
0x7fff5fbff7a4
0x7fff5fbff7a0
0x7fff5fbff7a0
0x7fff5fbff7a4Ich bin noch ein blutiger Anfänger (sieht man bestimmt am Code) und habe bestimmt einen dummen Denkfehler!
Vielen Dank im Voraus für eure Hilfe,
Karlovsky
-
Keina Ahnung, warum du jetzt unbedingt Pointer verwenden willst, aber du speicherst die Adressen der Funktionsparameter, die natürlich am Ende der Funktion ungültig sind.
-
Hi Manni,
mein tatsächlicher Code ist ein bisschen größer und enthält statt den Integerzeigern dann eine andere Klasse (Substanzen) als Eingabe. Ich hab nur mal fix ein Minimalbeispiel mit Integern zusammengeschrieben und das macht das Gleiche.
Ich würde allgemein erwarten, wenn X die Adresse 0x7fff5fbff7a4 und Y die Adresse 0x7fff5fbff7a0 haben, dass ich mit dem Initialisieren von point1 in der Reihenfolge (X,Y) meine Integerpointer *a mit 0x7fff5fbff7a4 und *b mit 0x7fff5fbff7a0 beschreibe. Das passiert auch. So weit, so gut!
Allerdings erwarte ich dann, wenn ich point2 mit den Argumenten andersrum initialisiere, also mit (Y,X), dass dort *a mit 0x7fff5fbff7a0 und *b mit mit 0x7fff5fbff7a4 beschrieben wird. Genau das passiert aber nicht, sondern Sie werden ebenso beschrieben wie bei point1.
Um vielleicht noch einmal meine Frage zu konkretisieren: Wie kann ich bewerkstelligen, dass *a mit der Adresse des ersten Eintrags und *b mit der Adresse des zweiten Eintrags beschrieben wird. Wahrscheinlich habe ich etwas ganz und gar nicht verstanden und würde mich eine Aufklärung freuen!
Beste Grüße,
Karlovsky
-
Ich habe deine Frage beantwortet - was erwartest du noch?
-
Karlovsky schrieb:
Um vielleicht noch einmal meine Frage zu konkretisieren: Wie kann ich bewerkstelligen, dass *a mit der Adresse des ersten Eintrags und *b mit der Adresse des zweiten Eintrags beschrieben wird?
-
Karlovsky schrieb:
Karlovsky schrieb:
Um vielleicht noch einmal meine Frage zu konkretisieren: Wie kann ich bewerkstelligen, dass *a mit der Adresse des ersten Eintrags und *b mit der Adresse des zweiten Eintrags beschrieben wird?
Indem du sie mit der Adresse des ersten und zweiten Enintags und nicht mit den Adressen der Funktionsparameter füllst?
-
Danke. Wenn ich das Problem gelöst habe, editier ich diesen Eintrag!
Edit:
Problem gelöst! Falls irgendein anderer Anfänger das gleiche Problem haben sollte, anbei die Lösung. Mit Mannis (für Anfänger kryptischen) Antworten zusammen, kann man sich die Lösung zusammenbasteln!#include <iostream> using namespace std; class intp{ int *a; int *b; public: void set_intp(int& A, int& B); // Das & nimmt dann die Adresse der Variablen die man reingibt!!!! void print_pA(); void print_pB(); }; void intp::print_pA(){ cout << a << endl; } void intp::print_pB(){ cout << b << endl; } void intp::set_intp(int& A, int& B){ // Das & nimmt dann die Adresse der Variablen die man reingibt!!!! a = &A; b = &B; } int main(int argc, const char * argv[]) { int X= 1; int Y= 2; intp point1; intp point2; point1.set_intp(X, Y); point2.set_intp(Y, X); point1.print_pA(); point1.print_pB(); point2.print_pA(); point2.print_pB(); return 0; }Ausgabe:
0x7fff5fbff7ec
0x7fff5fbff7e8
0x7fff5fbff7e8
0x7fff5fbff7ec
Program ended with exit code: 0Viele Grüße aus Frankreich,
Karlovsky
-
Ist dir bewusst, dass deine Parameter jetzt Referenzen sind und das
&beiint& Ahier überhaupt nichts mit Adressen zu tun hat? Die Verwendung von Referenzen führt jedenfalls zum Ziel weil du so nicht mehr die Adresse einer Parameter speicherst, sondern die der originalen Variablen. Aber wenn du eh schon Pointer benutzt könnte die Lösung auch so aussehen:void intp::set_intp(int* A, int* B){ a = A; b = B; } point1.set_intp(&X, &Y);
-
sebi707 schrieb:
Ist dir bewusst, dass deine Parameter jetzt Referenzen sind und das
&beiint& Ahier überhaupt nichts mit Adressen zu tun hat? Die Verwendung von Referenzen führt jedenfalls zum Ziel weil du so nicht mehr die Adresse einer Parameter speicherst, sondern die der originalen Variablen. Aber wenn du eh schon Pointer benutzt könnte die Lösung auch so aussehen:void intp::set_intp(int* A, int* B){ a = A; b = B; } point1.set_intp(&X, &Y);Ja, ist mir bewusst! Das ist dann in meinem eigentlichen Programm auch genau das, was ich will! Vielen Dank auch für deine Lösung!
Schönen Abend,
Karlovsky