Forum: Compiler & IDEs This Zeiger von objekt zu anderem objekt übergeben


von Ch D. (chrisu) Benutzerseite


Lesenswert?

Hi,
Ein Objekt soll einen Zeiger auf sich selbst an ein weiteres Objekt 
übergeben. Ich habe versucht als Parameter einfach "this" zu übergeben 
jedoch scheint das nicht zu funktionieren da es folgende Fehlermeldungen 
gibt wenn ich es dann über den übergebenden Zeiger ansprechen(eine 
Funktion aufrufen) will:
bei dem Objekt an den der Zeiger übergeben werden soll:
1
an_funktion(class ObjektNr1* ein_objekt1)/* das ist der Konstruktor des ObjektsNr2 das den Objektzeiger als parameter bekommen hat.*/
>invalid use of undefined type `struct das_objekt'

und bei dem Befehl eine Funktion des Objektes über den übergebenden 
Zeiger aufzurufen:
1
einobjekt1->funktion_des_obkjekts1();
>13 forward declaration of `struct das_objekt'

Das objekt ist eigentlich gar keine struct.

 Hier der Code wo das ObjektNr2 vom ObjektNr1 mit einem Zeiger auf 
ObjektNr1 mit new erzeugt werden soll.
1
 // in der objekt implemetation
2
neues_objekt2 = (ObjektNr2*) new ObjektNr2(this); /* hier wird das ObjektNr2 mit dem This Zeiger erzeugt.*/
3
//... der Konstruktor des ObjektNr2 
4
ObjektNr2(class ObjektNr1 * ein_objekt1){
5
    einobjekt1->funktion_des_obkjekts1(); // das funktioniert nicht. /* funktion_des_obkjekts1 existiert in ObjektNr1*/
6
}
Ich hoffe ihr könnt verstehen was ich meine und mir Tipps geben. Danke

von Karl H. (kbuchegg)


Lesenswert?

INcludiere das Header File, in dem deine Klasse definiert ist.

Eine Forward-Deklaration ist ausreichend, damit der COmpiler einen 
Pointer bilden kann. Dazu muss er nur wissen, dass es diese Klasse auch 
wirklich gibt. Die Forward-Deklaration teilt ihm das mit.
Willst du aber mit dem Objekt tatsächlich arbeiten, reicht eine 
Forward-Deklaration nicht. Da muss der Compiler schon den tatsächlichen 
Objektaufbau kennen um zu prüfen, ob das Objekt auch tatsächlich die 
aufgerufene Funktion unterstützt und welche Parameter die nimmt.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Deine Codeschnipsel enthalten etliche Fehler und unnötige typecasts.

Doch, das geht.
1
// Vorwärtsdeklaration
2
3
class B;
4
5
// Deklarationen
6
class A
7
{
8
public:
9
  A(B* p);
10
}
11
12
class B
13
{
14
public:
15
  B();
16
  int machwas();
17
}
18
19
20
// Implementierung
21
A::A(B* p)
22
{
23
  p->machwas();
24
}
25
26
int A::machwas()
27
{
28
  return 5;
29
}
30
31
B::B()
32
{
33
  A* p;
34
35
  p = new A(this);
36
}

von Ch D. (chrisu) Benutzerseite


Lesenswert?

Ich habe einfach Deklaration und Definition zusammen geschrieben und mit 
Includiert. Also da ist dann die implementierung bereits dabei.
Wie ich die Klasse jetzt genau umschreiben/aufteilen muss hab ich leider 
noch nicht ganz verstanden!

Reicht es aus die implementierung und Deklaration zusammen zu lassen?

p.s etliche Fehler? was denn genau? also das mit dem (ObjektNr2*) vor 
new habe ich wegemacht, was sollte noch verändert werdenß

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Ich habe einfach Deklaration und Definition zusammen geschrieben
> und mit Includiert. Also da ist dann die implementierung bereits dabei.

Das ist nicht nötig.

Mein obiges Beispiel kann auch in mehrere Dateien aufgegliedert werden:

a.h
1
class B; // Vorwärtsdeklaration
2
3
class A
4
{
5
public:
6
  A(B* p);
7
}

b.h
1
class B
2
{
3
public:
4
  B();
5
  int machwas();
6
}

a.cpp
1
#include "b.h"
2
#include "a.h"
3
4
A::A(B* p)
5
{
6
  p->machwas();
7
}
8
9
int A::machwas()
10
{
11
  return 5;
12
}

b.cpp
1
#include "a.h"
2
#include "b.h"
3
4
B::B()
5
{
6
  A* p;
7
8
  p = new A(this);
9
}

Der Trick ist die Vorwärtsdeklaration von B in a.h. So kann man 
Deklaration und Implementierung sauber getrennt halten.

> p.s etliche Fehler? was denn genau? also das mit dem
> (ObjektNr2*) vor new habe ich wegemacht, was sollte
> noch verändert werdenß
1
ObjektNr2(class ObjektNr1 * ein_objekt1){

sollte so aussehen:
1
ObjektNr2::ObjektNr2(ObjektNr1 * ein_objekt1){

Nenne Klassen nicht "Objekt", das ist irreführend. Ein Objekt ist eine 
Instanz einer Klasse.


Um einen Pointer auf eine Klasse zu deklarieren, muss das Schlüsselwort 
class nicht angegeben

von Ch D. (chrisu) Benutzerseite


Lesenswert?

Wenn ich die Klasse dann benutzen will, muss ich dann die .h oder die 
.cpp Datei includenß

von Ch D. (chrisu) Benutzerseite


Lesenswert?

Es funktioniert nun endlich, Danke. Das werde ich so schnell nicht mehr 
vergessen=)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.