類內的靜態成員函式

水水滴答發表於2024-03-07

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關鍵字進行宣告,並且不依賴於類的例項。它們可以透過類名加上作用域解析運算子::來呼叫,而不需要建立類的例項。

靜態成員函式的作用可以有以下幾個方面:

訪問靜態成員變數:靜態成員函式可以直接訪問類中的靜態成員變數(靜態資料成員),因為它們都屬於類本身而不是類的例項。

提供公共介面:靜態成員函式可以作為類的公共介面,提供對類的功能的訪問,而無需建立類的例項。其他程式碼可以直接使用類名加上作用域解析運算子呼叫靜態成員函式,以獲取類的某些功能或執行某些操作。

實現工具函式:靜態成員函式可以用於實現一些與類相關但不依賴於類的例項的工具函式。這些函式可以在類的定義中定義並透過類名直接呼叫。

協助建立物件:靜態成員函式可以用於協助建立類的物件。例如,單例模式中的靜態成員函式用於建立類的唯一例項。

總之,靜態成員函式是屬於類本身而不是類的例項的函式。它們可以在沒有建立類物件的情況下直接訪問,並提供對類的功能的訪問介面、實現工具函式、訪問靜態成員變數等功能。

相關文章