日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++中静态成员数据初始化问题

發布時間:2023/12/10 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中静态成员数据初始化问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 的最后,對類的靜態成員進行初始化

?

?

?

總結

以上是生活随笔為你收集整理的C++中静态成员数据初始化问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。