PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Befreundete Klassen ...



TheDodger
30-07-2003, 07:22
Ich habe da ein kleines logisches Problem ...

Bei der Klasse A wird im Header eine enum Liste angelegt, die public ist.
Klasse B wird nicht von der Klasse A abgeleitet und soll diese Liste ebenfalls nutzen können.




class A {

public:
enum Type { Eins, Zwei };

A() ;
~A();
};

class B {

public:
B( A::Type type );
~B();
};




Nur irgendwie klappt das nicht ganz so ... und ich will die enum nicht wirklich global halten ...

wraith
30-07-2003, 08:13
Poste mal Code,der nicht läuft :)
Es ist schwer dir zu helfen,wenn dein geposteter Code hier korrekt ist.

Alex_K
30-07-2003, 08:35
so sollte es funktionieren (nicht getestet):



class A {

public:
enum Type { Eins, Zwei };

A() ;
~A();

friend class B;
};

class B {

public:
B( A::Type type );
~B();
};

anda_skoa
30-07-2003, 10:08
Original geschrieben von wraith
Poste mal Code,der nicht läuft :)
Es ist schwer dir zu helfen,wenn dein geposteter Code hier korrekt ist.

Stimmt, kompiliert ohne Warnings (wenn man die fehlenden Bodies hinzufügt)

Ciao,
_

TheDodger
30-07-2003, 11:30
har ...

ich hatte in Klasse B die Klasse A als friend deklariert ... hmmm

aber ...



modules\setborder_colorstyle.h(41) : error C2653: 'SetBorder' : Keine Klasse oder Namespace
modules\setborder_colorstyle.h(41) : error C2629: 'class BorderColorStyle (' unerwartet
modules\setborder_colorstyle.h(41) : error C2238: Unerwartete(s) Token vor ';'
modules\setborder_colorstyle.h(55) : error C2653: 'SetBorder' : Keine Klasse oder Namespace
modules\setborder_colorstyle.h(55) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'm_type'
modules\setborder_colorstyle.h(55) : error C2501: 'Type' : Fehlende Speicherklasse oder Typbezeichner
modules\setborder_colorstyle.h(55) : error C2501: 'm_type' : Fehlende Speicherklasse oder Typbezeichner

setborder.h:

class SetBorder
: public uiSetBorder {

Q_OBJECT

public:

/**
Setzt den Typ, welche Art von Border bearbeitet werden soll.
*/
enum Type { Color, Style, Width, Margin, Padding };

/**
Die Position der einzelnen Border.
*/
enum Position { Top, Right, Bottom, Left };

/**
Constructor.
*/
SetBorder( Type type, const char* value, QWidget* parent, const char* name );

/**
Destructor.
*/
~SetBorder();

/**
Gibt den ausgewählten Wert zurück.
*/
QString value();

friend class BorderColorStyle();
};


-----------

setborder_colorstyle.h:

class BorderColorStyle
: public uiBorderColorStyle {

Q_OBJECT

public:

/**
Constructor.
*/
BorderColorStyle( SetBorder::Type type, const char* value, QWidget* parent, const char* name );

/**
Destructor.
*/
~BorderColorStyle();
};






SetBorder wäre in dem Falle Klasse A und BorderColorStyle Klasse B ...

ja, die includes stimmen! :)

TheDodger
30-07-2003, 11:44
Urgs ... ich vergaß noch etwas ...

In Klasse A wird Klasse B erzeugt ... ist das vielleicht eine Fehlermöglichkeit?

anda_skoa
30-07-2003, 11:45
du brauchst keinen Friend, wenn BorderColorStyle nicht auf private Members von SetBorder zugreifen muss.

Friend Deklarationen


friend class ClassName;

nicht


friend class ClassName();


ClassName() ist ein Konstuktoraufruf.

Hast du ein


#include "setborder.h"

in setborder_colorstyle.h?

wraith
30-07-2003, 12:11
Original geschrieben von anda_skoa



friend class ClassName();


ClassName() ist ein Konstuktoraufruf.

Nein,ein Syntaxfehler :).
Wundert mich das dort der Compiler nicht gemeckert hat.

BLUESCREEN3D
30-07-2003, 13:39
Andere Klassen als friend zu deklarieren ist sowieso schlechter Programmierstil AFAIK...

TheDodger
30-07-2003, 13:50
Original geschrieben von anda_skoa



friend class ClassName();


ClassName() ist ein Konstuktoraufruf.

ja, hatte ich auch schon gesehen ... am ergebniss ändert sich aber nicht's



Hast du ein


#include "setborder.h"

in setborder_colorstyle.h?

ja, hab ich