Verwendung von typedef enum in anderen Klassen



  • Hallo, ich habe folgendes Problem. In meiner Doc-Klasse ist eine Funktion

    bool GetPinRollerStatus(ELS_Status &Status);
    

    definiert. Dabei ist in der ...Doc.h die Status so definiert:

    typedef enum
    	{
    		INACTIV		=0,
    		ACTIV		=1,
    		UNDEFINED	=2
    	}
    	ELS_Status;
    

    In einem Dialog hab ich mir einen Zeiger auf das Doc geholt und möchte diese Funktion nun in dem Dialog auch ausführen. Dazu brauche ich ja eine Variable, die mir den Status zurückliefert. Im Dialog eine Variable vom Typ ELS_Status zu erzeugen bringt folgende Fehlermeldung: Fehlende Speicherklasse oder Typspezifizierer. Die ...Doc.h ist eingebunden.
    Was mach ich da falsch?


  • Mod

    Bist Du sicher, dass die Header Datei included wird und die diesen typedef nicht evtl. innerhalb einer Klasse gemacht hast.

    Das geht übrigends auch ohne typedef:

    enum ELS_Status
        { 
            INACTIV        =0, 
            ACTIV        =1, 
            UNDEFINED    =2 
        } 
        ;
    


  • Wenn du den enum in der Doc-Klasse hast, mußt du ihn bei "eigenständiger" Verwendung zuordnen:

    class CMyDoc : public CDocument
    {
      ...
    public:
      enum ELS_Status{INACTIVE,ACTIVE,UNDEFINED};
      bool GetPinRollerStatus(ELS_Status& rStat);//btw, so einen kleinen Wert kannst du auch als Rückgabe übergeben
      ...
    };
    
    ...
    //irgendwo anders
    CMyDoc* pDoc = GetMyDocument();
    CMyDoc::ELS_Status stat;
    pDoc->GetPinRollerStatus(stat);
    


  • Zunächst Euch beiden vielen Dank.
    @CStoll: Das explizite Zuweisen mittels CMyDoc::ELS_Status stat; hat jetzt erreicht, dass er in der anderen Klasse zumindest das Enum ELS_Status kennt. Allerdings sind jetzt die Werte des Enums unbekannt. Ich will das hier machen:

    void CPneumatikzylindertest::OnBnClickedTesten()
    {
    	// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    	CMyDoc::ELS_Status Status=UNDEFINED;
    	m_pDoc->GetPinRollerStatus(Status);
    
    	switch (Status)
    	{
    		case ACTIVE:	m_LedOben.SetLedState(LED_BUTTON_STATE_OFF);
    					m_LedMitte.SetLedState(LED_BUTTON_STATE_OFF);
    					m_LedUnten.SetLedState(LED_BUTTON_STATE_ON);
    					break;
    
    		case INACTIV:	m_LedOben.SetLedState(LED_BUTTON_STATE_OFF);
    					m_LedMitte.SetLedState(LED_BUTTON_STATE_ON);
    					m_LedUnten.SetLedState(LED_BUTTON_STATE_OFF);
    					break;
    
    		case UNDEFINED:	m_LedOben.SetLedState(LED_BUTTON_STATE_ON);
    					m_LedMitte.SetLedState(LED_BUTTON_STATE_OFF);
    					m_LedUnten.SetLedState(LED_BUTTON_STATE_OFF);
    					break;
    
    	}
    
    }
    

    ACTIV, INACTIV und UNDEFINED sind unbekannte Bezeichner. Ich kan auch nicht mit dem Punktoperator drauf zugreifen. Anscheindend seh ich grad den Wald vor lauter Bäumen nicht.



  • AndyDD schrieb:

    Zunächst Euch beiden vielen Dank.
    @CStoll: Das explizite Zuweisen mittels CMyDoc::ELS_Status stat; hat jetzt erreicht, dass er in der anderen Klasse zumindest das Enum ELS_Status kennt. Allerdings sind jetzt die Werte des Enums unbekannt. Ich will das hier machen:

    Für die einzelnen Enum-Werte gilt das selbe:

    switch(Status)
    {
    case CMyDoc::ACTIV:
      ...
    }
    

    Noch zwei Anmerkungen zu deinem Code:

    1. Getter schreibt man meistens so, daß sie den angeforderten Wert als Rückgabe zurückliefern:
    ELS_Status GetPinRollerStatus() const/*ich lese nur aus, ohne das Document zu verändern*/
    { return m_PinRollerStatus; }
    
    1. Denglisch ist zwar inzwischen üblich, macht dein Programm aber nicht besonders lesbar 😉 Also entscheide dich bitte zwischen ACTIVE (Englisch) oder AKTIV (Deutsch) - keine Mischformen


  • Danke CStoll, ich werde das berücksichtigen. Denglisch kann ich ja eigentlich auch nicht ab. Aber noch zwei Fragen:
    1. Ich habe in der Zwischenzeit mal rumprobiert und festgestellt, dass man auch über den Zeiger m_pDoc auf die Enum-Inhalte zugreifen kann. Was ist aber dann der Unterschied zwischen CMyDoc::ACTIVE und m_pDoc->ACTIVE?

    2. Die Struktur der Getter-Funktion ist bewußt so gewählt worden. Da innerhalb der Funktion auf eine Messkarte zugegriffen wird will ich im Falle eines Fehlschlagens dieses Zugriffs false zurückgeben, damit man das Ergebnis validieren kann. Sollte man das anders machen?


  • Mod

    1. :: ist der Scope Operator. Damit gibst Du nur den Bezug zur Klasse an. Damit kann man statische Objekte und Typen in den Klassen auflösen.
    Für -> benötigt einen gültigen Zeiger.

    2. Getter sollten den entsprechenden Typ returnieren. In einem Fehlerfall ist hier dann das Arbietn mit Exceptions sicherlich einfacher.



  • Martin Richter schrieb:

    1. :: ist der Scope Operator. Damit gibst Du nur den Bezug zur Klasse an. Damit kann man statische Objekte und Typen in den Klassen auflösen.
    Für -> benötigt einen gültigen Zeiger.

    2. Getter sollten den entsprechenden Typ returnieren. In einem Fehlerfall ist hier dann das Arbietn mit Exceptions sicherlich einfacher.

    Danke für die Auskunft. Für 1. hätte ich ja einen gültigen Zeiger, aber :: ist hier sicher der richtige Weg wenn man damit die Inhalte einer Klasse auflösen kann.
    Für 2.: ok, das mit den Exceptions gibts ja auch noch. Dann werde ich das mal umsetzen...


Anmelden zum Antworten