C+±项目笔记-针对从0到1学习VIO中代码中的遗忘知识点
代码举例
父类
class Edge {
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
/**
* 构造函数,会自动化配雅可比的空间
* @param residual_dimension 残差维度
* @param num_verticies 顶点数量
* @param verticies_types 顶点类型名称,可以不给,不给的话check中不会检查
*/
//explicit关键字的作用就是防止类构造函数的隐式自动转换
explicit Edge(int residual_dimension, int num_verticies,
const std::vector<std::string> &verticies_types = std::vector<std::string>());
virtual ~Edge();//基类的析构函数是虚函数
virtual void ComputeResidual() = 0;
,,,
}
子类
class CurveFittingEdge: public Edge
{
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
CurveFittingEdge( double x, double y ): Edge(1,1, std::vector<std::string>{"abc"})//子类显示调用父类的构造函数
{
x_ = x;
y_ = y;
}
// 计算曲线模型误差
virtual void ComputeResidual() override //virtual override 同时修饰函数讲解 https://blog.csdn.net/quietbxj/article/details/112979555
{
Vec3 abc = verticies_[0]->Parameters(); // 估计的参数
residual_(0) = std::exp( abc(0)*x_*x_ + abc(1)*x_ + abc(2) ) - y_; // 构建残差
}
,,,
}
1. 继承
以下代码表示公共继承,基类public中成员函数与成员变量均可以被子类继承
class CurveFittingEdge: public Edge
以下代码表示子类显示调用父类的构造函数,即子类初始化前应该完成父类的初始化
CurveFittingEdge( double x, double y ): Edge(1,1, std::vector<std::string>{"abc"})//子类显示调用父类的构造函数
{
x_ = x;
y_ = y;
}
2.explicit关键字
以下代码中explicit关键字的作用就是防止类构造函数的隐式自动转换,但是在下面无意义,因为参数不是单独参数,而且多参数也没有默认值
explicit Edge(int residual_dimension, int num_verticies,
const std::vector<std::string> &verticies_types = std::vector<std::string>());
2.virtual、override关键字同时修饰函数
父类中用virtual修饰,不实现,纯虚函数,子类实现同名函数的时候重写函数,用基类指针或子类指针调用时,调用到的都是子类的函数。
父类
virtual void ComputeResidual() = 0;
在派生类的成员函数中使用override时,如果基类中无此函数,或基类中的函数并不是虚函数,编译器会给出相关错误信息,子类中的virtual可加或者不加
子类
virtual void ComputeResidual() override
{
Vec3 abc = verticies_[0]->Parameters(); // 估计的参数
residual_(0) = std::exp( abc(0)*x_*x_ + abc(1)*x_ + abc(2) ) - y_; // 构建残差
}