2012-04-03 10 views
-1

Ich versuche, eine C++ - Klasse zu erstellen, die als Halter für mein Projekt arbeiten kann, also habe meine Klassenmitglieder und Funktionen statisch implementiert, aber ich weiß nicht, warum Compiler den _nTriggerMode innerhalb erkennen kann der setTriggerMode.Statisches Member in C++ - Programmierung

Hier ist meine Header-Datei:

#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(); 
}; 

Und hier ist die .ccp Datei:

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

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

GrabberOptions::~GrabberOptions(void) 
{ 
} 

Hohlraum setTriggerMode (int trigger) { _nTriggerMode = trigger; }

Bitte geben Sie mir eine Idee, wie Sie statische verwenden.

+0

Welche Fehler bekommen Sie? – Rps

+2

-1. "Ein Fehler" beschreibt das Problem nicht. Sagen Sie, welchen Fehler Sie bekommen. –

+0

mögliches Duplikat von [Was bedeutet es, einen undefinierten Verweis auf ein statisches Element zu haben?] (Http://stackoverflow.com/questions/7092765/what-does-it-mean-to-have-an-undefined-reference) -to-a-static-member) – Flexo

Antwort

4

static Klasse Membervariablen außerhalb der Klassendefinition definiert werden müssen:

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

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

hmjd, danke für deine Antwort. Können Sie bitte hinzufügen, wie kann ich meine Setter auch hinzufügen, weil ich diesen Code in meiner .cpp-Datei versuchen, \t void setTriggerMode (int triggerMode) {_nTriggerMode = triggerMode; } Aber ich weiß nicht, warum es eine rote Linie unter dem _nTriggerMode gibt? – user261002

+0

Sieht so aus, als ob der Funktionsname nicht mit dem Namen der Klasse qualifiziert wird.Wechseln Sie zu: void GrabberOptions :: setTriggerMode (int triggerMode) '. – hmjd

+0

Danke, es hat funktioniert: D – user261002

4

Sie müssen die statische außerhalb der Klassendefinition initialisieren, in einer einzigen Übersetzungseinheit (in der Regel Ihre entsprechenden Implementierungsdatei):

#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, ich sehe, es ist so anders als JAVA. Ich danke dir sehr. : D – user261002

+0

ist es das gleiche für Methoden? – user261002

+0

@ user261002 nicht unbedingt, Methoden können innerhalb der Klasse definiert werden. Konstante Integrale auch (aber Ihr Mitglied ist nicht). –

1

Die static Mitgliedsvariablen einer Klasse werden von allen Instanzen einer Klasse gemeinsam verwendet. Sie sind gelegentlich nützlich, aber das ist wahrscheinlich kein Beispiel. Statische Memberfunktionen können nur auf statische Membervariablen zugreifen.

Ihr Klassendesign, das durch den auskommentierten Code angezeigt wird, hat keine pro Instanz Daten; alles ist statisch. Das ist im Grunde nie ein gutes Design in C++.