C++笔记-针对从0到1学习VIO中代码中的遗忘知识点

文章探讨了C++中Edge类及其子类CurveFittingEdge的实现,涉及构造函数的显式调用、继承、explicit关键字的作用以及virtual和override在虚函数重写中的应用。CurveFittingEdge用于计算曲线拟合误差,通过重写ComputeResidual方法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/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关键字的作用就是防止类构造函数的隐式自动转换,但是在下面无意义,因为参数不是单独参数,而且多参数也没有默认值

    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_;  // 构建残差
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值