Klassenuebergreifeinder Variablen Zugriff mit Static

Hallo,

ich möchte einen Klassenuebergreifeinden Variablenzugriff realisieren.
Dabei habe ich folgnedes gefunden:
(Quelle: Klassenattribute in C++)

#include <iostream>
using namespace std;

class StatKlasse
{
public:
    StatKlasse() {Zaehler++;}
    ~StatKlasse() {Zaehler--;}
    static int wieviele() {return Zaehler;}
private:
    static int Zaehler;
};

int StatKlasse::Zaehler=0;

int main()
{
    cout << StatKlasse::wieviele() << endl;
    StatKlasse feld[4];
    cout << StatKlasse::wieviele() << endl;
    {
        StatKlasse feld[5];
        cout << StatKlasse::wieviele() << endl;
    }
    cout << StatKlasse::wieviele() << endl;
}

Adaptiert für Arduino:

#define SP Serial.print
#define SPL Serial.println

void setup() {
 Serial.begin(115200);
delay(100);

class StatKlasse
{
public:
    StatKlasse() {Zaehler++;}
    ~StatKlasse() {Zaehler--;}
    static int wieviele() {return Zaehler;}
private:
    static int Zaehler;
};

}
void loop() {
  SPL(StatKlasse::wieviele()); 
  delay(5000);  
}

Leider bekomme ich (nach Adaption der Ausgabe Syntax von cout… zu Serial.println…) die Fehlermeldung:

Arduino: 1.6.1 (Linux), Platine: “Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)”

/home/johannes/_000_NEU/100_Projekte_NEU/Arduino/arduino-1.6.1/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10601 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR -I/home/johannes/_000_NEU/100_Projekte_NEU/Arduino/arduino-1.6.1/hardware/arduino/avr/cores/arduino -I/home/johannes/_000_NEU/100_Projekte_NEU/Arduino/arduino-1.6.1/hardware/arduino/avr/variants/mega /tmp/build2263947604447603914.tmp/KlassenuebergreifeinderVariablenZugriff_BSP.cpp -o /tmp/build2263947604447603914.tmp/KlassenuebergreifeinderVariablenZugriff_BSP.cpp.o
KlassenuebergreifeinderVariablenZugriff_BSP.ino: In function ‘void setup()’:

KlassenuebergreifeinderVariablenZugriff_BSP.ino:15:16: error: local class ‘class setup()::StatKlasse’ shall not have static data member ‘int setup()::StatKlasse::Zaehler’ [-fpermissive]

KlassenuebergreifeinderVariablenZugriff_BSP.ino: In function ‘void loop()’:
KlassenuebergreifeinderVariablenZugriff_BSP.ino:20:7: error: ‘StatKlasse’ has not been declared
Fehler beim Kompilieren.

Wo liegt der Fehler? Ist diese Art im Arduino c++ nicht möglich?

Wie kann ich von meherern Instanzen der Klasse B auf eine (ein und die selbe) Variable der Klasse A zugreifen, ohne diese Variable in A public zu machen?

Vielen Dank!
PS: OOP Anfänger!

Die Klammer ist falsch gesetzt. Die Klassen-Definition gehört außerhalb der setup() Funktion

Danke für den Hinweis. Code enstrechend geändert. Leider noch nicht ohne Fehler.

#define SP Serial.print
#define SPL Serial.println

class StatKlasse
{
public:
    StatKlasse() {Zaehler++;}
    ~StatKlasse() {Zaehler--;}
    static int wieviele() {return Zaehler;}
private:
    static int Zaehler;
};

void setup() {
 Serial.begin(115200);
delay(100);
}

void loop() {
  SPL(StatKlasse::wieviele()); 
  delay(5000);  
}

Fehlermeldung jetzt:

Arduino: 1.6.1 (Linux), Platine: "Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

/tmp/build2263947604447603914.tmp/KlassenuebergreifeinderVariablenZugriff_BSP.cpp.o: In function setup': /home/johannes/_000_NEU/100_Projekte_NEU/Arduino/arduino-1.6.1/KlassenuebergreifeinderVariablenZugriff_BSP.ino:16: undefined reference to StatKlasse::Zaehler'
/tmp/build2263947604447603914.tmp/KlassenuebergreifeinderVariablenZugriff_BSP.cpp.o: In function loop': /home/johannes/_000_NEU/100_Projekte_NEU/Arduino/arduino-1.6.1/KlassenuebergreifeinderVariablenZugriff_BSP.ino:20: undefined reference to StatKlasse::Zaehler'
collect2: error: ld returned 1 exit status
Fehler beim Kompilieren.

Irgendwo muss das statische

int StatKlasse::Zaehler;

definiert sein.

Bei dir am einfachsten vor void setup () {}

Bingo! Vielen Dank! :slight_smile: