2012-04-03 3 views
-1

J'essaie de créer une classe C++ qui peut fonctionner en tant que support pour mon projet, donc j'ai implémenté mes membres et fonctions de classe statiques, mais je ne sais pas pourquoi le compilateur peut reconnaître le _nTriggerMode à l'intérieur le setTriggerMode.Membre statique en programmation C++

Voici mon fichier d'en-tête:

#pragma once 
class GrabberOptions 
{ 
private: 
    static int _nTriggerMode; 
    static int _nExposureInMicroSec; 
    static double _dFramesPerSecond; 
    static int _nExsysncOn; 

public: 
    GrabberOptions(void); 
    ~GrabberOptions(void); 
    static void setTriggerMode(int triggerMode); 
    static void setExposureInMicroSec(int exposureMicroSec); 
    static void setFramePerSecond(double framePerSec); 
    static void setExsysncOn(int exsysncOn); 

    static int getTriggerMode(); 
    static int getExposureInMicroSec(); 
    static double getFramePerSecond(); 
    static int getExsysncOn(); 
}; 

Et voici le fichier .ccp:

#include "StdAfx.h" 
#include "GrabberOptions.h" 
int GrabberOptions::_nTriggerMode; 

int GrabberOptions :: _ nExposureInMicroSec; double GrabberOptions :: _ dFramesPerSecond; int GrabberOptions :: _ nExsysncOn; GrabberOptions :: GrabberOptions (void) { _nTriggerMode = GRABBER_CONTROLLED; _nExposureInMicroSec = 20; _dFramesPerSecond = 1000; _nExsysncOn = 1; }

GrabberOptions::~GrabberOptions(void) 
{ 
} 

setTriggerMode void (int triggerMode) { _nTriggerMode = triggerMode; }

Veuillez me donner une idée de l'utilisation de l'électricité statique.

+0

Quelles erreurs obtenez-vous? – Rps

+2

-1. "Une erreur" ne décrit pas le problème. Dites quelle erreur vous obtenez. –

+0

duplication possible de [Qu'est-ce que cela signifie d'avoir une référence indéfinie à un membre statique?] (Http://stackoverflow.com/questions/7092765/what-does-it-mean-to-have-an-undefined-reference -to-static-member) – Flexo

Répondre

4

static variables membres de classe doivent être définies en dehors de la définition de la classe:

// .h file 
class GrabberOptions 
{ 
private: 
    static double _dFramesPerSecond; // declaration 

// .cpp file 
double GrabberOptions::_dFramesPerSecond = 1000; // definition 
+0

hmjd, merci pour votre réponse. pouvez-vous ajouter s'il vous plaît comment puis-je ajouter mes setters, parce que j'essaye ce code dans mon fichier .cpp, \t void setTriggerMode (int triggerMode) {_nTriggerMode = triggerMode; } mais je ne sais pas pourquoi il y a une ligne rouge undet le _nTriggerMode? – user261002

+0

On dirait que le nom de la fonction n'est pas qualifié avec le nom de la classe.Remplacez par: 'void GrabberOptions :: setTriggerMode (int triggerMode)'. – hmjd

+0

Merci ça a marché: D – user261002

4

Vous devez initialiser la statique en dehors de la définition de la classe, dans une unité de traduction unique (généralement votre fichier d'implémentation correspondant):

#include "StdAfx.h" 
#include "GrabberOptions.h" 

double GrabberOptions::_dFramesPerSecond; //initializes to 0 
//double GrabberOptions::_dFramesPerSecond = 1337; //if you want a different value 

GrabberOptions::GrabberOptions(void) 
{ 
    // _nTriggerMode  = GRABBER_CONTROLLED; 
    // _nExposureInMicroSec = 20; 
     _dFramesPerSecond = 1000; 
    // _nExsysncOn   = 1; 
} 

GrabberOptions::~GrabberOptions(void) 
{ 
} 
+0

ok, je vois, sa forme si différente JAVA. Merci beaucoup. : D – user261002

+0

est-ce la même chose pour les méthodes? – user261002

+0

@ user261002 pas nécessairement, les méthodes peuvent être définies à l'intérieur de la classe. Constantes intégrales aussi (mais votre membre ne l'est pas). –

1

Les variables de membre static d'une classe sont partagées par toutes les instances d'une classe. Ils sont parfois utiles, mais ce n'est probablement pas un exemple. Les fonctions membres statiques peuvent uniquement accéder aux variables de membre statiques.

Votre conception de classe indiquée par le code commenté n'a pas de données par instance; Tout est statique. Ce n'est essentiellement pas un bon design en C++.

Questions connexes