我有一个课程,它结合了许多OpenCV的cv::Mat
矩阵。
有没有什么方法可以提供允许客户端读取但不能写入底层数据的const访问器,以及允许客户端读取和写入数据的非const访问器。
我正在考虑做这样的事情:
class MyClass {
cv::Mat a;
public:
cv::Mat a() { return a; }
const cv::Mat& a() const { return a; }
};
但是这会保护底层数据不被const访问器修改吗?或者它只是保护cv :: Mat的头数据?
答案 0 :(得分:1)
如果您被迫提供对cv::Mat
对象本身的访问权限,那么您就不走运了。即使在data
上,也可以通过const cv::Mat
指针进行数据访问。因此,代码:
const cv::Mat test = cv::Mat::ones(3, 3, CV_8UC1);
test.data[3] = 4;
将编译并执行。
但是,如果您只需要提供对数据的访问权限,那么您可以为cv::Mat::begin()
和cv::Mat::end()
提供包装函数,这些函数允许const cv::Mat
上的只读访问权限:
class MyClass
{
cv::Mat a;
public:
cv::MatIterator_<uchar> begin() {return a.begin<uchar>();}
cv::MatConstIterator_<uchar> begin() const {return a.begin<uchar>();}
cv::MatIterator_<uchar> end() {return a.end<uchar>();}
cv::MatConstIterator_<uchar> end() const {return a.end<uchar>();}
};
MyClass m;
const MyClass& mref = m;
auto it = mref.begin();
*it = 4; //Compile error here
对于这个例子,我使用uchar
作为数据类型,但是很容易使这些传递模板参数。