如何获得私人会员的“读取权限”?

时间:2017-07-03 14:47:07

标签: c++ pointers

在以下情况下,C ++中最好的做法是什么?

我的班级有一些双指针作为私人成员:

class A
{
private:
    int** data;
    //...//
public:
    int** get_data () const { return data; };
    //...//
}

有时我想检查此指针内的值并更改它们。为此目的,有一些get函数get_data

A* obj = new A();
//...//
int** data_from_A = obj->get_data();
// some manipulations with data_from_A pointer

但是,如果我想确信在进一步使用中什么都不会改变,该怎么办? 如何只获得data指针的“读访问权”?

当然,我们可以将data指针公开,但在这种情况下,它可以从外部更改,这是不可接受的......

谢谢!

2 个答案:

答案 0 :(得分:1)

答案是将“数据”设为私有,并使其成为“朋友”的功能。然后保护成员不被访问,除非在您的特殊功能中。

然而朋友功能通常是设计不佳的标志,因此您可能希望重新考虑重构以消除对此的需求。

答案 1 :(得分:1)

在C ++中,原始指针,尤其是指针算术,只能深入埋藏在利用它们进行高性能计算的类中。

将指向数组的指针提供给外部的唯一原因是你使用了一些其他重写的代码,比如用于编写C风格代码的人编写的高度优化的解算器(带有实际上在C中的求解器可能是。)

如果没有,请使用标准库中的类,如std :: vector(dynamic),std :: array(static)或std :: list(linked)。

这会将您的代码转换为类似

的代码
private:
    vector<vector<int> > data;

public:
    const vector<vector<int> >& get_data() const { return data; }

这很简单,一个const完全足够了,子矢量不再像原始数组那样需要。

另一种方式是使用

const int& get_data(const size_t i, const size_t j) const { return data[i][j]; }

即使你当前的代码也可以使用。

对于矢量,请记住,如果你想暂时使用它,那么你必须得到它

const vector<vector<int> >& data = myClass.get_data();

而不是其中任何一个

vector<vector<int> >& data = myClass.get_data(); //compile error
vector<vector<int> > data = myClass.get_data(); //works but unnecessarily copies the data