This Zeiger von objekt zu anderem objekt übergeben

OP Persönliche Seite #1418221
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
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.
Persönliche Seite
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
}
OP Persönliche Seite
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ß
Persönliche Seite
> 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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.