3

いくつかの 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 のヘッダー データを保護するだけですか?

4

1 に答える 1

2

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、データ型として使用しましたが、これらをテンプレート パラメーターに沿って渡すのは簡単です。

于 2013-05-14T15:37:37.553 に答える