C++中靜態成員數據初始化問題
1、靜態成員變量:定義為靜態成員意味著它能被所有的實例化對象所共有,其修改值為該類的其它所有實例所見。
下面看一個例子
class people
{
public:people(int i):id(i){num++;}
private:static int num;int id;
};
?
num為靜態成員,每調用有參構造一次num就自加一次。
首先看people這個類的空間長度sizeof(people);? ? ?注意結果為4而不是8,因為num是每個實例化對象所共有的,不是單獨一個對象的空間。
下面來看靜態成員的初始化問題:
class people
{
protected:static const int age=18;static int num;static string name;
};
int people::num=0;
string people::name;
string people::name("alex");
1、C++規定如果是const限定的成員變量可以直接在類內初始化
2、非const限定要在類外初始化。初始方法是<類型>? <作用域>::變量名=值;
3、靜態對象做成員變量,初始化只需要再定義一次就行了,這樣會調用類的無參構造,如果需要傳遞值則加括號。
?
3、兩種處理方式,C++11編譯器報錯
第一種代碼如下:
Frame.h文件
class Frame{public:Frame();//Frame(const cv::Mat &frame):mCurrentFrame(frame){};//main函數直接調用read來讀取圖像,傳遞給Frame類內部//Frame(const cv::Mat &frame, const cv::Mat K);//main函數直接調用read來讀取圖像,傳遞給Frame類內部Frame(const cv::Mat K);void showFrame(cv::Mat keyFrame);cv::Mat ImageToGray();//彩色圖像轉換灰度圖cv::Mat getCameraMatrix();cv::Mat getDistMatrix();//cv::Mat cropImg();//裁剪//ReadFile *readFile;//ReadCalibParameter();//float fx;private://cv::Mat mCurrentFrame;static cv::Mat mK; //std::string mCurrentFile;static float fx;static float fy;static float cx;static float cy;};
Frame.cpp文件
Frame::Frame(const cv::Mat K){//mCurrentFile = CurrentFile; //mCurrentFrame = frame;/*cv::FileStorage fsSetting(camerParamterPath.c_str(), cv::FileStorage::READ);if (!fsSetting.isOpened()){std::cerr << "ERROR: Failed to open file ReadAlgorithmParameter file! Please check Wrong path to settings " << mFilePath << std::endl;return -1;}fx = fsSetting["fx"] ;fy = fsSetting["cx"] ;cx = fsSetting["fy"] ;cy = fsSetting["cy"] ;*/fx = K.at<float>(0,0);fy = K.at<float>(1,1);cx = K.at<float>(0,2);cy = K.at<float>(1,2);}
編譯器報錯信息:意思是靜態成員是未定義的引用;根本原因就是沒有在類外對靜態成員進行初始化
?
修正:
class Frame{public:Frame();//Frame(const cv::Mat &frame):mCurrentFrame(frame){};//main函數直接調用read來讀取圖像,傳遞給Frame類內部//Frame(const cv::Mat &frame, const cv::Mat K);//main函數直接調用read來讀取圖像,傳遞給Frame類內部Frame(const cv::Mat K);void showFrame(cv::Mat keyFrame);cv::Mat ImageToGray();//彩色圖像轉換灰度圖cv::Mat getCameraMatrix();cv::Mat getDistMatrix();//cv::Mat cropImg();//裁剪//ReadFile *readFile;//ReadCalibParameter();//float fx;private://cv::Mat mCurrentFrame;static cv::Mat mK; //std::string mCurrentFile;static float fx;static float fy;static float cx;static float cy;};float Frame::fx = 0;float Frame::fy = 0;float Frame::cx = 0;float Frame::cy = 0;
在Fram.cpp 的最后,對類的靜態成員進行初始化
?
?
?