Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

MAX

Senior Schreiberling

  • "MAX" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

1

Friday, January 17th 2003, 11:58am

Klassen und Zeiger in C++

Hallo!!!
Ich habe folgendes Problem:
Angenommen ich habe folgende Klasse:

Source code

1
2
3
4
5
6
7
8
9
10
11
class Demo
{
private :
Demo *p1, *p2;
public:
Demo() {p1 = p2 = NULL};
Demo getP1();
void setP1(Demo &element);
Demo getP2();
void setP1(Demo &element);
}


Dann möchte ich in meinem Programm folgenden Aufruf machen:

Source code

1
2
3
Demo a, b;
a.setP1(b);
a.getP1().setP1(a);

Das funktioniert nicht => Programmabstrurz
Warum???

Folgender Aufruf funktioniert, obwohl er genau das gleiche bewirkt:

Source code

1
2
3
4
Demo a,b,c;
a.setP1(b);
c = a.getP1();
b.setP1(a);


mfg
MAX

migu

free rider

  • "migu" is male

Posts: 2,643

Date of registration: Dec 11th 2001

Occupation: Developer

2

Friday, January 17th 2003, 12:58pm

Hi MAX,

da sind ein paar Fehler in deinem Code gewesen. :O
Ich habe es mal so aufgeschrieben und es funktioniert.

#include <iostream>

class Demo
{
private:
Demo *p1, *p2;

public:
Demo() {p1 = p2 = NULL;}
Demo *getP1() {return p1;}
void setP1(Demo &p1) { p1=p1;}
Demo *getP2() {return p2;}
void setP2(Demo &p2) { p2=p2;}
};


int main()
{
Demo a, b;
a.setP1(b);
(a.getP1())->setP1(a);
return 0;
}

Mit Pointern kenne ich mich leider nicht (mehr) so gut aus. Deshalb kann ich jetzt nicht erklären, wie das genau zusammenhängt.
Meine Variante halte ich aber für vernünftig.
So, jetzt geh ich erst mal in die Mensa. :)
tar: Anlegen eines leeren Archivs wird feige verweigert.

spehler62

Praktikant

Posts: 17

Date of registration: Aug 6th 2002

3

Friday, January 17th 2003, 2:00pm

@ Max:

Du kannst auch den Punktoperator benutzen, nur mußt du dann statt

a.setP1(b);
a.getP1().setP1(a);

(*a).setP1(b);
((*a).getP1()).setP1(a);

schreiben. (sollte funktionieren !!!)

Der Pfeiloperator, den Migu vorgeschlagen hat, ist extra für Zeiger gedacht.

"Ein Mann, der Kinder und Hunde hasst, kann nicht durch und durch schlecht sein." W.C.Fields

paradroid

Junior Schreiberling

Posts: 231

Date of registration: Feb 28th 2002

4

Friday, January 17th 2003, 2:02pm

Der Fehler ist, dass getP1 ein "Demo"-Objekt liefert, also eine neukostruierte Kopie(!) des Inhalts von p1. Besser ist hier eine Referenz zu liefern: Demo&

(Bißchen schwer zu sagen, so ohne die Implementation, was spehler sagt, geht so m.E. nicht [falsche Datentypen])

# transmission terminated #

MAX

Senior Schreiberling

  • "MAX" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

5

Friday, January 17th 2003, 4:10pm

Danko schon zuerst...

@migu
Der einziger Fehler, denn ich hatte war bei den set Methoden, habe jetzt statt "p1" "element" reingeschrieben, sonst macht es keinen Sinn. Die Implementation von den Methoden habe ich hier nicht reingestellt, tut hier auch nichts zu Sache, aber man kann sich denken. Der Pfeiloperator tut hier auch nichts zu Sache, da ich keine Zeiger auf Demo Klasse deklariere ausserhalb der Klasse, sondern einfach auf private Elemente der Klasse mittels der Methoden zugreife. Die privaten Elemente sind einfach Zeiger auf das gleiche Objekt.

Ich werde auf jeden Fall (spätestens am Dienstag) ausprobieren.
mfg
MAX

MAX

Senior Schreiberling

  • "MAX" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

6

Friday, January 17th 2003, 4:40pm

Sorry

Ich glaube, ich muss meine Frage voerst zurückziehen, denn
Ich habe das jetzt noch mal zu Hause überprüft und es gab keinen Fehler, so wie ich es geschrieben habe ist richtig und funktioniert auch. Komisch, dass bei mir auf der Arbeit das nicht ging, naja. Ich werde mir es nochmal am Dienstag anschauen und bis dahin danke ich schon allen für ihre Bemühungen!!!
mfg
MAX