GCC Compiler, Klassendefinition und Zugriff auf Member-Variable geht nicht

OP #5327627
Lesenswert?
• ▲
▼
Hallo

Ich habe ein kleines Problem mit einem Cpp-Code
und finde den Fehler nicht.

Den Code habe ich im Anhang dazu gepackt.
Ich möchte dazu sagen, dass ich kein C-Profi bin, sondern noch lerne.

Folgendes:
Beim compilieren mit der Gnu-Compiler-Collection erhalte ich folgende 
Fehlermeldung:

include/statemachine.cpp:26:6: error: ‘stateFlags’ was not declared in 
this scope
  if (stateFlags & (1<<FLAG_CHANGED))
      ^

Was ich nicht verstehe ist, dass die anderen Variablen, die genauso 
deklariert wurden funktionieren.

Der Code ist einfach aufgebaut.
Ich möchte eine kleine Klasse schreiben namens Statemachine.
Diese hat 3 Routinen:

 - setState(newState) zum setzen eines neuen Zustandes
 - getState()         zum Abfragen des Zustandes
 - changed()          zum prüfen, ob der Zustand sich geändert hat

Dafür gibt es eine entsprechende Header-Datei und die zugehörige 
Code-Datei. Das ganze rufe ich in mein.cpp zum Testen auf.

Zum kompilieren habe ich eine makefile dabei.

Kann mir jemand den Fehler sagen, warum nur die Variable stateFlags 
angeblich nicht deklariert sein soll, während die anderen Variablen 
(stateCurrend und stateOld) tatellos verarbeitet werden?

Hier mal die Klassendefinition:

#ifndef _statemachine_h
#define _statemachine_h

#include <stdint.h>
#include <stdio.h>

//#include <string.h>

class Statemachine
{

  public:

    Statemachine();  // Constructor

    void setState(uint8_t newState);
    uint8_t getState();
    bool changed();

  private:
    // internal variables
    uint8_t stateCurrent;    // Current State
    uint8_t stateOld;        // Previous State
    uint8_t stateFlags;      // Flags

    // Definitions stateFlags
      #define FLAG_CHANGED 0    // Flag State Changed

};


#endif // _statemachine_h

Wäre toll, wenn ihr mir helfen könnt.
Danke.

Micha
Angehängte Dateien:
Gast #5327632
Lesenswert?
• ▲
▼
Hallo!

changed() ist nicht als Methode der Klasse definert, daher hat diese 
Routine keinen Zugriff auf die member. Es müsste in statemachine.cpp

bool Statemachine::changed()

statt

bool changed()

heissen.
Persönliche Seite #5327745
Lesenswert?
• ▲
▼
Micha R. schrieb:
> Vielleicht sollte anstatt '#define' besser 'const' verwendet werden.

Genau so.

Sofern sich dem noch weitere Werte hinzugesellen, könntest Du auch ein 
enum verwenden.

> Wie definieren und an welcher stelle müsste ich das dann,

An genau der bisherigen.

Auch bei einem enum wäre das nicht anders, das gehört dann ebenfalls zur 
Klasse.

Und damit ist auch das Namespace-Problem von enums in C umgangen, denn 
das enum gehört zur Klasse.
OP #5327776
Lesenswert?
• ▲
▼
Wenn ich in der Klassendefinition im Block private schreibe:

  private:
    // internal variables
    uint8_t stateCurrent;    // Current State
    uint8_t stateOld;        // Previous State
    uint8_t stateFlags;      // Flags

        // Definitions stateFlags
        const static uint8_t FLAG_CHANGED = 0;    // Flag State Changed

lässt es sich kcompilieren und FLAG_CHANGED ist in main.cpp ungültig.
So soll es sein.

Aber ohne static gibts Comilier-Fehler.

Muss static in dem Fall sein und
belegt das keinen Speicher (1 Byte)?

Wie wäre es, wenn ich die Definition des Flags
so mache
#define FLAG_CHANGED 0

aber die Definition in Statemachine.cpp, also nicht im Header ablege?
Das hat sich auch compilieren lassen und im main.cpp war das Flag 
unbekannt. Also richtig.



Wäre das eine option?
OP #5327828
Lesenswert?
• ▲
▼
Danke für die vielen Hinweise

In denke, "static const uint8_t FLAG_CHANGED=0;"

belegt vermutlich ein Byte Speicher.

ich habs jetzt mit enum gelöst.
1
  private:
2
    // internal variables
3
    uint8_t stateCurrent;        // Current State
4
    uint8_t stateOld;        // Previous State
5
    uint8_t stateFlags;          // Flags
6

7
        // Definitions stateFlags
8
        //static const uint8_t FLAG_CHANGED=0;    // Flag State Changed
9
        enum
10
        {
11
            FLAG_CHANGED=0,
12
            FLAG_TIMEOUT=1
13
        };

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.