类内的静态成员函数

A-LOAM代码中,用ceres构建优化问题时,有如下代码

struct LidarEdgeFactor
{
	LidarEdgeFactor(Eigen::Vector3d curr_point_, Eigen::Vector3d last_point_a_,
					Eigen::Vector3d last_point_b_, double s_)
		: curr_point(curr_point_), last_point_a(last_point_a_), last_point_b(last_point_b_), s(s_) {}

	template <typename T>
	bool operator()(const T *q, const T *t, T *residual) const
	{

		Eigen::Matrix<T, 3, 1> cp{T(curr_point.x()), T(curr_point.y()), T(curr_point.z())};
		Eigen::Matrix<T, 3, 1> lpa{T(last_point_a.x()), T(last_point_a.y()), T(last_point_a.z())};
		Eigen::Matrix<T, 3, 1> lpb{T(last_point_b.x()), T(last_point_b.y()), T(last_point_b.z())};

		//Eigen::Quaternion<T> q_last_curr{q[3], T(s) * q[0], T(s) * q[1], T(s) * q[2]};
		Eigen::Quaternion<T> q_last_curr{q[3], q[0], q[1], q[2]};
		Eigen::Quaternion<T> q_identity{T(1), T(0), T(0), T(0)};
		q_last_curr = q_identity.slerp(T(s), q_last_curr);
		Eigen::Matrix<T, 3, 1> t_last_curr{T(s) * t[0], T(s) * t[1], T(s) * t[2]};

		Eigen::Matrix<T, 3, 1> lp;
		lp = q_last_curr * cp + t_last_curr;

		Eigen::Matrix<T, 3, 1> nu = (lp - lpa).cross(lp - lpb);
		Eigen::Matrix<T, 3, 1> de = lpa - lpb;

		residual[0] = nu.x() / de.norm();
		residual[1] = nu.y() / de.norm();
		residual[2] = nu.z() / de.norm();

		return true;
	}

	static ceres::CostFunction *Create(const Eigen::Vector3d curr_point_, const Eigen::Vector3d last_point_a_,
									   const Eigen::Vector3d last_point_b_, const double s_)
	{
		return (new ceres::AutoDiffCostFunction<
				LidarEdgeFactor, 3, 4, 3>(
			new LidarEdgeFactor(curr_point_, last_point_a_, last_point_b_, s_)));
	}

	Eigen::Vector3d curr_point, last_point_a, last_point_b;
	double s;
};

其中static ceres::CostFunction *Create(...)函数是类的静态成员函数。关于静态成员函数,chatgpt回答:

类内的静态成员函数(static member function)是属于类本身而不是类的实例的函数。它们被声明为静态成员函数,因此可以在没有创建类对象的情况下直接访问。

静态成员函数在类的定义中使用static关键字进行声明,并且不依赖于类的实例。它们可以通过类名加上作用域解析运算符::来调用,而不需要创建类的实例。

静态成员函数的作用可以有以下几个方面:

访问静态成员变量:静态成员函数可以直接访问类中的静态成员变量(静态数据成员),因为它们都属于类本身而不是类的实例。

提供公共接口:静态成员函数可以作为类的公共接口,提供对类的功能的访问,而无需创建类的实例。其他代码可以直接使用类名加上作用域解析运算符调用静态成员函数,以获取类的某些功能或执行某些操作。

实现工具函数:静态成员函数可以用于实现一些与类相关但不依赖于类的实例的工具函数。这些函数可以在类的定义中定义并通过类名直接调用。

协助创建对象:静态成员函数可以用于协助创建类的对象。例如,单例模式中的静态成员函数用于创建类的唯一实例。

总之,静态成员函数是属于类本身而不是类的实例的函数。它们可以在没有创建类对象的情况下直接访问,并提供对类的功能的访问接口、实现工具函数、访问静态成员变量等功能。

posted @ 2024-03-07 11:21  水水滴答  阅读(7)  评论(0编辑  收藏  举报