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