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 的最后,对类的静态成员进行初始化