www.mikrocontroller.net

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


Autor: Ch D. (chrisu) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
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:
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.
 // in der objekt implemetation
neues_objekt2 = (ObjektNr2*) new ObjektNr2(this); /* hier wird das ObjektNr2 mit dem This Zeiger erzeugt.*/
//... der Konstruktor des ObjektNr2 
ObjektNr2(class ObjektNr1 * ein_objekt1){
    einobjekt1->funktion_des_obkjekts1(); // das funktioniert nicht. /* funktion_des_obkjekts1 existiert in ObjektNr1*/
} 

Ich hoffe ihr könnt verstehen was ich meine und mir Tipps geben. Danke

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Codeschnipsel enthalten etliche Fehler und unnötige typecasts.

Doch, das geht.
// Vorwärtsdeklaration

class B;

// Deklarationen
class A
{
public:
  A(B* p);
}

class B
{
public:
  B();
  int machwas();
}


// Implementierung
A::A(B* p)
{
  p->machwas();
}

int A::machwas()
{
  return 5;
}

B::B()
{
  A* p;

  p = new A(this);
}

Autor: Ch D. (chrisu) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
class B; // Vorwärtsdeklaration

class A
{
public:
  A(B* p);
}

b.h
class B
{
public:
  B();
  int machwas();
}

a.cpp
#include "b.h"
#include "a.h"

A::A(B* p)
{
  p->machwas();
}

int A::machwas()
{
  return 5;
}

b.cpp
#include "a.h"
#include "b.h"

B::B()
{
  A* p;

  p = new A(this);
}

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ß
ObjektNr2(class ObjektNr1 * ein_objekt1){

sollte so aussehen:
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

Autor: Ch D. (chrisu) Benutzerseite
Datum:

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

Autor: Ch D. (chrisu) Benutzerseite
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.