3

我有一个结合了许多 OpenCVcv::Mat矩阵的类。

有什么方法可以提供允许客户端读取但不写入基础数据的 const 访问器和允许客户端读取和写入数据的非 const 访问器。

我正在考虑做这样的事情:

class MyClass {
    cv::Mat a;

public:
    cv::Mat a() { return a; }
    const cv::Mat& a() const { return a; }
};

但这会保护底层数据不被 const 访问器修改吗?还是只是保护 cv::Mat 的标头数据?

4

1 回答 1

2

如果您被迫提供对cv::Mat对象本身的访问,那么您就不走运了。即使dataconst cv::Mat. 因此,代码:

const cv::Mat test = cv::Mat::ones(3, 3, CV_8UC1);
test.data[3] = 4;

将编译并执行。

但是,如果您只需要提供对数据的访问权限,那么您可以为 and 提供包装函数cv::Mat::begin()cv::Mat::end()这确实允许对 a 进行只读访问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了数据类型,但是很容易让它们传递一个模板参数。

于 2013-05-14T15:37:37.553 回答