[C++] Klassen deklarieren zu Beginn

*cerox*

Lt. Commander
Registriert
Feb. 2005
Beiträge
1.357
Hallo zusammen,

ich habe hier ein objektorientiertes Programm mit zwei Klassen. Jede Klasse hat eine Methode der anderen Klasse zum friend deklariert. Dadurch kommt immer die Fehlermeldung, die Klasse wäre nicht bekannt, je nachdem welche Klasse in der Datei eben zuerst deklariert wird.

Jetzt würde ich beide Klassen gerne ganz am Anfang "bekannt geben" - bei Funktionen würde ich oben einen Prototyp nutzen - wie mache ich das bei Klassen?

Achja: Programmiersprache C++
 
AW: Klassen deklarieren zu Beginn

das ganze nennt sich forward declaration. einfach "class Klassenname;" vor die entsprechende andere klassen definition packen.

ist auch in anderen situationen sehr nützlich(z.b. um die compilier zeit bei großen projekten oder komplizierten headern stark zu verringern).
 
Zuletzt bearbeitet:
AW: Klassen deklarieren zu Beginn

Hi,

jetzt kommt nur noch ein (vorher zwei) Fehler:

In der Klasse1 steht
friend klasse2::methode (void);

Die Methode existiert natürlich in der Klasse2 und der Compiler sagt nun, "klasse2:methode" is not a member of klasse 2.
 
AW: Klassen deklarieren zu Beginn

Handelt es sich bei den friend Methoden um Klassen- oder Instanzmethoden ?
 
AW: Klassen deklarieren zu Beginn

Es handelt sich um Methoden einer anderen Klasse.

Sie soll zum friend deklariert werden, damit in Methode-xy von Klasse 2 Objekte der Klasse 1 verwendet werden können.
 
Was du brauchst nennt sich prototyping und das geht so:

Du schreibst die Signatur der Methoden zuerst:

void method1(int x);
int method2();

und dann die definition der methoden.

Somit kennt methode 1 auch die nach ihr definierte methode 2.
 
Ich habe jetzt ganz oben die Klasse zwei sowie deren Methode deklariert:

class klasse2;
void klasse2::methode (void);

klasse2::methode (void) is not a member of klasse2.
 
Kannst du nicht mal die beiden Klassen komplett posten, damit man sich mal einen Überblick verschaffen kann?
Alternativ auch ein äquivalentes Minimalbeispiel?
 
Ok, ich poste die relevanten Stellen:

Code:
class kunden; 
void kunden::detailausg (int detail_id);
//die beiden Zeilen wurden mir ja oben so empfohlen, jedoch geht es weiterhin nicht

class videos
{	
public:
friend void kunden::detailausg (int);
};

class kunden
{
public:
void detailausg (int detail_id);
};


Ich habe in der Klasse Kunden eine Methode "detailausg", die die Kundendaten auflistet. Jetzt möchte ich in NUR in dieser Methode und keiner anderen Objekte der Klasse Videos erstellen können; daher die friend Deklaration oben in der Video-Klasse.
 
das verstehe ich jetzt nicht so ganz. warum schreibst du nicht einfach die kunden klasse zuerst in die datei(oder includierst deren header). zumindest im beispiel hat sie ja keinen verweis auf die videos klasse.

ansonsten würde ich es mal mit "class kunden { public void kunden::detailausg (int detail_id); };" als forward declaration versuchen. eine methoden declaration muss schließlich immer innerhalb ihrer klasse erfolgen, nur die definition darf ausserhalb stehen.
 
Ich habe jetzt mal zum Test die ganze Klasse zum friend der anderen deklariert (so funktioniert es) - da das aber nicht nötig ist, möchte ich das auf eine Methode begrenzen.

warum schreibst du nicht einfach die kunden klasse zuerst in die datei

Das geht nicht, da in der Kundenklasse ebenfalls eine Methode der Videoklasse zum friend deklariert wurde. Vertausche ich nun die Reihenfolge der Klassen, kommt der gleiche Fehler bei der Methode in der Kundenklasse - ich befinde mich dann also wieder da wo ich jetzt schon bin.

ansonsten würde ich es mal mit "class kunden { public void kunden::detailausg (int detail_id); };"

Für mich sieht das von der Syntax her gesehen so aus, als existiere die Klasse Kunden dann zweimal. Müsste dann nicht vom Compiler ein Fehler kommen wenn man nochmal mit class kunden { deklarationen }; anfängt?
 
videos.h
Code:
#ifndef VIDEO_H
#define VIDEO_H
class videos
{	
public:
videos();
protected:
void test();

friend class kunden;
};
#endif

videos.cpp
Code:
#include "videos.h"
#include "kunden.h"

videos::videos()
{
	kunden meinKunde;

	meinKunde.detailausg(0);
}

void videos::test()
{

}

kunden.h
Code:
#ifndef KUNDE_H
#define KUNDE_H
class kunden
{	
public:
kunden();
protected:
void detailausg (int detail_id);
friend class videos;
};
#endif

kunden.cpp
Code:
#include "videos.h"
#include "kunden.h"

kunden::kunden()
{
};

void kunden::detailausg (int detail_id)
{
   videos meinVideo;

   meinVideo.test();
}

Oder habe ich etwas falsch verstanden?
Wenn Du nicht die ganze Klassse als friend haben möchtest, dann geht das auch ist aber auch nicht unbedingt schöner:
Auszug aus der VC++ Online Hilfe:

Code:
// friend_functions.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
class Point
{
    friend void ChangePrivate( Point & );
public:
    Point( void ) : m_i(0) {}
    void PrintPrivate( void ){cout << m_i << endl; }

private:
    int m_i;
};

void ChangePrivate ( Point &i ) { i.m_i++; }

int main()
{
   Point sPoint;
   sPoint.PrintPrivate();
   ChangePrivate(sPoint);
   sPoint.PrintPrivate();
}

MfG

Arnd
 
Zuletzt bearbeitet:
Zurück
Oben