Werte zurückgeben
-
Hallo NG,
ich habe in einem Design Pattern Brücke Werte, die ich zurückgeben muss. Und das bereitet mir gerade Probleme. Ich mach mal ein hoffentlich ausreichend ausführliches, aber trotzdem knappes Beispiel.
Hier ist die abstrakte Implementierung für die Repräsentation verschiedener Sachen. Um die Werte VALUE_1 bis VALUE_N geht es hier. Die muß ich zurückgeben.
class Implementierer{ public: Implementierer(); virtual ~Implementierer(); virtual int func1Imp() = 0; virtual int funcNImp() = 0; protected: static const int VALUE_1 = 0; ... static const int VALUE_N = 9586496; };Hier ist eine abstrakte Klasse, die dazu dient um verschiedene Dinge abzuleiten.
#include "implementierer.h" class Abstraktion{ public: Abstraktion(); virtual ~Abstraktion(); virtual int func1() = 0; ... virtual int funcN() = 0; protected: Implementierer *imp; };Hier ist eine von Abstraktion abgeleitete Klasse die eine von vielen möglichen Dingen repäsentiert. Je nachdem, werden die Methoden andere Implementierung haben.
#include "abstraktion.h" class SpezielleAbstraktion : public Abstraktion{ public: SpezielleAbstraktion(); virtual ~SpezielleAbstraktion(); virtual int func1(); ... virtual int funcN(); };Hier ist die konkrete Implementierung für eine bestimmte Sache.
#include "implementierer.h" class KonkreteImplementierer : public Implementierer{ public: KonkreteImplementierer(); virtual ~KonkreteImplementierer(); virtual int func1(); ... virtual int funcN(); };Hier ist eine beispielhafte Implementierung.
#include "konkreteimplementierer.h" KonkreteImplementierer::KonkreteImplementierer() : Implementierer(){ } KonkreteImplementierer::~KonkreteImplementierer(){ } int KonkreteImplementierer::func1Imp(){ return VALUE_17; } int KonkreteImplementierer::funcNImp(){ return VALUE_43; }Hier ist eine SpezielleAbstraktion. Sie erzeugt sich die benötigte Implementierung und das wars.
#include "spezielleabstraktion.h" SpezielleAbstraktion::SpezielleAbstraktion(){ imp = new KonkreteImplementierer(); } SpezielleAbstraktion::~SpezielleAbstraktion(){ delete imp; } int SpezielleAbstraktion::func1(){ return imp->func1Imp(); } int SpezielleAbstraktion::funcN(){ return imp->funcNImp(); }Ich möchte nun in der main Funktion wissen, welchen Wert mit meine SpezielleAbstraktion zurück gegeben hat.
#include <iostream> #include "spezielleabstraktion.h" using namespace std; int main(int argc, char *argv[]){ SpezielleAbstraktion spAb = new SpezielleAbstraktion(); switch(sbAb->func1()){ case VALUE_17: cout << "Bim" << endl; break; case VALUE_43: cout << "Bam" << endl; break; default: cerr << "Falscher Wert" << endl; } return 0; }Aber der Compiler meint er kennt die Werte VALUE_X nicht. Egal ob sie public sind oder nicht.
Dabei müßten sie durch die includiererrei sichtbar sein, den das File in dem main steht, includiert SpezielleAbstraktion.
SpezielleAbstraktion includiert Abstraktion,
Abstraktion includiert Implementierer und dadrin stehen die Werte.
Es hat auch keine Rolle gespielt, wie ich auf die VALUE_X zugegriffen habe. Also z.B. folgendes ging auch nicht.switch(sbAb->func1()){ case sbAb->VALUE_17: // Ging nicht cout << "Bim" << endl; break; case Implementierer::VALUE_43: // Ging auch nicht cout << "Bam" << endl; break; default: cerr << "Falscher Wert" << endl; }Wie kann ich in main auf die VALUE_X zugreifen?
Gruß,
M. Incani
-
Lange Frage, kurze Antwort: Mit Implementierer::VALUE_X. Damit man von außen darauf zugreifen kann, müssen die Konstanten natürlich public sein!