C++一个函数中的二传手/吸气手?

C++ setter/getter in one function?

本文关键字:二传手 函数 一个 C++      更新时间:2023-10-16

我一直在做一个C++课程,其中一个家庭作业要求实现一个图像类,该类具有私人成员的rows_,cols_,data_。其中数据是长度行 X 列的向量。他们要求实现一种方法,您可以在给定一行和一列的情况下访问data_的值,这很好。但是,他们也希望能够为该位置分配一个值,如下所示:

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

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

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

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

然而,并不过分的是提供一个恒量正确的函数。 如果您有一个 const 图像对象并希望从中读取像素,这一点很重要。

所以,你可能有这样的东西:

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 引用的更通用形式。 当然,如果你只是使用整数,则 const 版本根本不需要返回引用——它可以只返回int,而非 const 函数仍然会返回int&

是 声明返回引用的方法。

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

然后,为输出分配新值将重写内存中data分配的数据,因为这是引用指向的位置。

这类似于 eg。std::vector at

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