Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » static Klasse

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.03.2006, 19:44 Uhr
Karldin Shinowa
Professional Noob


so das Beispiel scheint nicht viel sinn zu haben da alles static ist aber es geht nicht anders:

C++:
//Timer.h
#include<allegro.h>//eine Grafikbibliothek
class CTimer
{
   private:
      static volatile long speedCounter;
      static bool activated;
      
   public:
      CTimer();
      CTimer(int BSP);
      static void IncrementSpeedCounter();
      static void DecrementSpeedCounter();
      static long GetSpeedCounter();
      static void Activate(int BSP);
};

//TimerDefs.cpp
#include"Timer.h"

CTimer::CTimer()
{
   speedCounter=0;
   activated=false;
  
}

CTimer::CTimer(int BSP)
{
   speedCounter=0;
   LOCK_VARIABLE(speedCounter);
   LOCK_FUNCTION(IncrementSpeedCounter);
   install_int_ex(IncrementSpeedCounter,BPS_TO_TIMER(BSP));
   activated=true;
}
  
  

static void CTimer::IncrementSpeedCounter()
{
   speedCounter++;
}
END_OF_FUNCTION(IncrementSpeedCounter);//allegro spezifisch

static void CTimer::DecrementSpeedCounter()
{
   speedCounter--;
}

static long CTimer::GetSpeedCounter()
{
   return speedCounter;
}

static void CTimer::Activate(int BSP)
{
   if(!activated)
   {
      LOCK_VARIABLE(speedCounter); //allegro spezifisch
      LOCK_FUNCTION(IncrementSpeedCounter);//allegro spezifisch
      install_int_ex(IncrementSpeedCounter,BPS_TO_TIMER(BSP));//allegro spezifisch
      activated=true;
   }
}



schaut doch ok aus oder?
Fehler sagt er allerdings:
38 CDokumente und Einstellungen\Martin\Desktop\ALLEGRO\TimerDefs.cpp
cannot declare member function `CTimer::Activate(int)' to have static linkage
das sagt er bei allen Funktionen.

Geb ich das static weg kommen Linker errors:
[Linker error] undefined reference to `CTimer::speedCounter'
[Linker error] undefined reference to `CTimer::activated'
--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.03.2006, 12:17 Uhr
RHBaum



1. static members muessen expliziet definiert werden ... also im gegensatz zu normalen members, die man nur in der Initialisierungsliste initialisiert. Ist auch logisch, Members haengen an der Klasse und werden bei der instantiierung erzeugt, static members haengen an keiner instanz ... Dafuer werden statische variablen immer mit 0 initialisiert, wenn man sie nicht expliziet anders initialisiert (macht man gleich bei der definition), im gegensatz zu members, wenn man die vergisst ... steht da muell drin .

long CTimer::speedCounter = 0; // fehlt in einer datei die code erzeugt
bool CTimer::activated = true;

2. static bei memberfunktionen darf nur bei der deklaration stehen, bei der definition nicht mehr :
void CTimer::Activate(int BSP)
{
// ...
}

3. Du weisst schon, das konstruktor und destruktor nie aufgerufen werden, wenn du keine Instanzen erzeugst ? Warum hasst du dann einen ? Vor allem mit init code ?
Es macht durchaus sinn klassen zu bauen von denen man nie ne instanz ziehen wird ... frag mal die Template-Fetischisten ! ^^

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.03.2006, 17:52 Uhr
Karldin Shinowa
Professional Noob


jetzt kommt :


[Warning] In function `_static_initialization_and_destruction_0':
[Linker error] undefined reference to `CTimer::CTimer(void)'
--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.03.2006, 22:56 Uhr
ref



@RHBaum verhalten statische variablen wie variablen die als public in einer klasse deklariert sind oder gibt es unterschiede?

C++:
#include<iostream>
using namespace std;


class test{
    public:
        int a;
        static int b;
};

int test::b=0;
int main()
{
    test c;
    c.a=3;
    c.b=7;
    
    cout<<c.a<<" "<<c.b;
    return 0;
}






--
Man kann ein Problem nicht mit der gleichen Denkweise lösen, mit der es erschaffen wurde. (Albert Einstein)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
31.03.2006, 10:19 Uhr
RHBaum




Zitat:

statische variablen wie variablen die als public


das sind 2 komplett paar andere schuhe.

public / private sind zugriffsmodifizierer. Damit ueberwacht der compiler, das nur bestimmte module usw auf eine variable zugreifen koennen.

static, extern, global, volatile dagegen haben direkten einfluss auf ablage einer variablen.

Bei static wird zum beispiel immer nur eine Instanz der static variable, egal wieviele instanzen du von der eigentlichen klasse erzeugst, erstellt.
Das hat folgende konsequenz, do kannst diese Variable auch ohne instanz der klasse verwenden.

Du kannst static variablen natuerlich auch private machen, dann haben nur friends, und methoden der klasse (statische und normale) zugriff auf die variable. Ausnahme ist die initialisierung, die muss von ausserhalb gehen.

Ansonsten kannst darauf zugreifen wie mit normalen members.... dein c.b ist vollkommen korrect.
Aber du brauchst keine Instanz c um drauf zu kommen, in deinem fall waere test::b genau das gleiche ... nur ohne ne Instanz zu benutzen.

Viel intreassanter ist aber dieses verhalten:


C++:
int main()
{
    test c1,c2
    c1.a=3;
    c1.b=7;

    c2.a = 99;
    c2.b = 42;
    
    cout<<c1.a<<" "<<c1.b << " " << c2.a << " " << c2.b;
    return 0;
}



Statische variablen sind damit eigentlich nur im namespace einer klasse versteckte globale variablen.

@Karldin

oO ewas hasst da wieder gemacht ^^
Welchen compiler nutzt du ?
und zeig mal bisserl mehr code .... was genau hasst geaendert?

deine compiler meldung sagt dir sowas wie ... du legst grad eine Instanz von CTimer selber statisch an, und das kann er nich weil ihm der DCTor fehlt ....
Zur erzeugung von ner Instanz brauchst die konstruktoren schon, nur du hasst static members in deiner klasse, dann macht es nicht viel sinn eine Instanz der klasse auch noch statisch anzulegen ....

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: