2012-04-03 52 views
-1

我想創建一個C++類,它可以作爲我的項目的持有人,所以實現了我的類成員和函數靜態,但我不知道爲什麼編譯器可以識別內部的_nTriggerMode setTriggerMode。靜態成員在C++編程

這裏是我的頭文件:

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

這裏是.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(INT triggerMode){ _nTriggerMode = triggerMode; }

請給我一些關於如何使用靜態的想法。

+0

你會得到什麼錯誤? – Rps 2012-04-03 16:07:46

+2

-1。 「一個錯誤」沒有描述問題。告訴你得到什麼錯誤。 – 2012-04-03 16:12:06

+0

可能的重複[對一個靜態成員有一個未定義的引用意味着什麼?](http://stackoverflow.com/questions/7092765/what-does-it-mean-to-have-an-undefined-reference - 靜態成員) – Flexo 2012-04-03 16:12:09

回答

4

static類成員變量必須在類定義之外定義:

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

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

hmjd,謝謝你的回覆。你可以添加我怎麼可以添加我的設置器,因爲我正在嘗試在我的.cpp文件中的代碼,\t void setTriggerMode(int triggerMode){_nTriggerMode = triggerMode; }但我不知道爲什麼有一個紅線undet the _nTriggerMode? – user261002 2012-04-03 16:31:21

+0

看起來好像函數名稱不符合類的名稱。改爲:void GrabberOptions :: setTriggerMode(int triggerMode)'。 – hmjd 2012-04-03 16:34:33

+0

謝謝,它確實有效:D – user261002 2012-04-03 16:38:12

4

需要初始化靜態類定義之外,在一個單一的翻譯單元(通常是對應的實現文件):

#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

好吧,我看到,它的形式與JAVA差別很大。非常感謝。 :D – user261002 2012-04-03 16:11:44

+0

方法是一樣的嗎? – user261002 2012-04-03 16:12:32

+0

@ user261002不一定,方法可以在類內定義。也是恆定積分(但你的成員不是)。 – 2012-04-03 16:13:51

1

一個類的static成員變量被一個類的所有實例共享。它們偶爾有用,但這可能不是一個例子。靜態成員函數只能訪問靜態成員變量。

註釋掉的代碼顯示您的類設計沒有每個實例的數據;一切都是靜態的。這在C++中基本上不是一個好的設計。