Klasse soll auf Member einer anderen zugreifen
-
Gegeben:
Klasse Color:
#ifndef COLOR_H #define COLOR_H #include <iostream> #include <cmath> #include <cfloat> #include "global.h" //! Stores colors in RGB values class Color { private: double HuetoRGB(double m1, double m2, double h ); public: //! The color has and red green and blue component. double r, /**< The red component */ g, /**< The green component*/ b; /**< The blue component */ Color(double r=0.0, double g=0.0, double b=0.0); ~Color (); ... void get(double& r, double g, double& b); }; #endif
Klasse Main:
#include "Color.h" class LimsMain { public: LimsMain(int argc, char** argv); ~LimsMain(); Color text_color; ... };
und Klasse Painter:
#include "Color.h" #include "LimsMain.h" class LimsPainter { public: LimsPainter(); ~LimsPainter(); ...
In einer Funktion der Klasse Painter sieht es so aus:
... double test1 = 0.0; double test2 = 0.0; double test3 = 0.0; text_color.get(test1, test2, test3); <-- Fehlermeldung: undeclared identifier ...
Sowohl Color als auch das Member text_color sind public, warum ist das hier unbekannt? Rufe ich es mit
Main::text_color.get(test1, test2, test3);
auf, lautet die Fehlermeldung "error C2228: left of '.get' must have class/struct/union type".
Wie genau greife ich nun auf text_color zu? Muss ich dazu etwas als friend deklarieren?
-
text_color ----> LimsMain
-
Brausepaul schrieb:
Rufe ich es mit
Main::text_color.get(test1, test2, test3);
auf, lautet die Fehlermeldung "error C2228: left of '.get' must have class/struct/union type".
Meintest du
LimsMain::text_color.get(test1, test2, test3);
Das würde nur funktionieren, wenn text_color statisch wäre.
Ansonsten brauchst du eine Instanz von LimsMain, über die kannst du dann auf text_color zugreifen.
-
Ja, ich meinte LimsMain,hab mich vertippt.
Das heisst ich brauche z.B. in der Klasse Painter einen Member, der mir den Zugriff auf Main ermoeglicht? Z. B. einen Pointer pMain, den ich nach der Instanzierung des Painter-Objekts auf das Main-Objekt verbiege?
@pueppi
?
-
Brausepaul schrieb:
Das heisst ich brauche z.B. in der Klasse Painter einen Member, der mir den Zugriff auf Main ermoeglicht? Z. B. einen Pointer pMain, den ich nach der Instanzierung des Painter-Objekts auf das Main-Objekt verbiege?
Das wäre eine Möglichkeit. Es gibt aber auch noch andere. Da ich die Stuktur deines Codes nicht kenne, rate ich einfach mal drauf los. Es gibt wohl nur ein einziges LimsMain Objekt in deiner Anwendung, dh du kannst auch ein globales Objekt anlegen, welches von allen Klassen genutzt werden kann, wie es zB std::cin und std::cout ist. Du kannst aus LimsMain dazu auch ein Singleton machen, das ist aber kein MUSS und hängt davon ab, ob du sowas in deinem Fall für sinnvoll hälst.
-
Danke erstmal fuer die Antwort.
Ich habe mich jetzt dafuer entschieden, in der Painter-Klasse einen Pointer auf LimsMain anzulegen, klappt hervorragend. Du hast Recht, es gibt nur ein Main-Objekt.