繁体   English   中英

C++ setter/getter 合二为一 function?

[英]C++ setter/getter in one function?

我一直在学习 C++ 课程,其中一个作业要求实现一个图像 class,它具有私有成员的 rows_、cols_、data_。 其中 data 是长度为 X cols 的向量。 他们要求实现一种方法,您可以在给定行和列的情况下访问 data_ 的值,这很好。 但是,他们也希望能够为 position 分配一个值,如下所示:

int val = image.at(row, col);
Image.at(row, col) = 255;

我对我来说似乎很奇怪,如果我返回对 data_ 条目的引用,上述功能会起作用吗? 我觉得你不应该允许 Image.at(row,col) =255; 因为这打破了data_的封装?

以这种方式返回对一些内部数据的引用是很合理的。

如果您非常担心,您总是可以返回一个仅允许对单个像素进行操作的包装器 object,但这可能是矫枉过正。

然而,提供一个 const 正确的 function并不过分。 如果您有一个 const 图像 object 并想从中读取像素,这一点很重要。

所以,你可能有这样的事情:

class Image
{
public:
    Image()
        : mWidth(0)
        , mHeight(0)
    {}

    Image(int width, int height, const Pixel& color = {})
        : mWidth(width)
        , mHeight(height)
        , mBuffer(width * height, color)
    {}

    Pixel& at(int row, int col)
    {
        return mBuffer.at(row * mWidth + col);
    }

    const Pixel& at(int row, int col) const
    {
        return mBuffer.at(row * mWidth + col);
    }

private:
    int mWidth, mHeight;
    std::vector<Pixel> mBuffer;
};

请注意,我在这里使用Pixel来展示返回 const-reference 的更通用形式。 当然,如果您只是使用整数,则 const 版本根本不需要返回引用——它可以只返回int ,而非 const function 仍然会返回int&

是的,声明返回引用的方法。

int & at(int row, int col) {return data[row * width + col];}

为 output 分配新值将重写 memory 中分配的data成员内部某处的数据,因为这是引用指向的位置。

这类似于例如。 std::vector at

基于这是大多数标准容器和迭代器的工作方式,我会说这很好。 请记住const的正确性并提供 const 访问器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM