C++ C++;封装阵列

C++ C++;封装阵列,c++,arrays,encapsulation,C++,Arrays,Encapsulation,很抱歉,如果以前有人问过这个问题,但我找不到足够清楚的答案 C++中的数组成员提供公共只读访问的正确方法是什么? 如果我有一个像下面这样的课程: class Particle { double _position[10]; public: double* get_position() { return _position; } }; 我想返回指向数组的指针是非常糟糕的,因为这意味着它可以随时更改 在类之外的任何时候,返回一个常量指针就足

很抱歉,如果以前有人问过这个问题,但我找不到足够清楚的答案

C++中的数组成员提供公共只读访问的正确方法是什么? 如果我有一个像下面这样的课程:


class Particle
{
    double _position[10];

public:
    double* get_position()
    {
       return _position;
    }
};
   
我想返回指向数组的指针是非常糟糕的,因为这意味着它可以随时更改 在类之外的任何时候,返回一个常量指针就足够了吗

我在C++中使用了数组的其他问题,如何更好地使用向量,但是我对这个问题很好奇。 正如你所看到的,我只是一个C++ NoOB,如果这是个愚蠢的问题,抱歉。
p.D.很抱歉我的英语不好。

您可以返回常量指针:

class Particle
{
    double _position[10];

public:
    const double* get_position() const
    {
       return _position;
    }
};
请注意,我还设置了成员函数const(第二个
const
),告诉编译器可以在
const
粒子实例上调用此成员函数


注意:正如您已经提到的,更好的解决方案是使用STL向量等等…

返回常量*并不是更好,因为调用者可以直接丢弃常量


考虑提供常量迭代器,而不是返回指针。这样,类的用户就可以访问位置,而无需公开实现细节。如果以后要从固定长度数组切换到STL容器,可以在不影响类用户的情况下进行切换。

是,返回指向数组(或数组元素)的常量指针

FWIW,我曾经使用const引用在类中实现了只读状态代码:

class Foo
{
public:
    const int &     err = &errcode;

private:
    int             errcode;
    ...
}
(如果语法不太正确,请道歉。)

这允许
Foo
的客户端读取但不修改
Foo::err
,这是对实际私有错误代码
Foo::errcode
的常量引用,可由类的成员函数修改。

不使用原始数组;始终首选
std::array
(或者如果您的编译器不够新,无法提供
std:
std::tr1::
实现):

类粒子
{
公众:
typedef std::数组位置\u t;
粒子():位置{}
positions_t&get_positions(){返回位置}
positions_t const&get_positions()const{返回位置}
私人:
位置\u t位置\u;
};

与您希望提供访问权限的任何其他成员一样,您可以返回对其的
常量引用:

const double ( &get_position() const )[10] { return position; }
当然,您可能希望使用
typedef
使其更易于阅读

或者,由于它是一个数组,您可以实现
操作符[]

const double& operator[](std::size_t n) const { return position[n]; }

至少有三个问题/意见:

  • 返回数组
  • 返回元素
  • 返回一个
    std::vector
返回数组 您始终可以返回指向数组的指针,但在传递数组时,应始终指定容量。不幸的是,函数只能返回一个值,因此必须从函数中返回“out”参数:

double * get_position(unsigned int& capacity);
// Or
void  get_position(double *& array_pointer, unsigned int& capacity);
返回元素 通过提供返回单个元素的函数,可以隐藏内部{array}表示。这提供了边界检查的优势

  double get_one_position(unsigned int index)
  {
    double result = 0.0;
    if (index >= MAX_CAPACITY)
    {
       // Errror handling
    }
    else
    {
      result = _position[index];
    }
    return result;
  }
返回一个
std::vector
C++中的P>更喜欢<代码> STD::向量< /代码>数组。您的问题是切换的原因之一。std::vector
可以传递给方法,也可以从方法返回。另外,
std::vector
维护自己的容量变量,因此无需将容量与数组指针一起传递

  std::vector<double> _position(10);
  std::vector<double> get_positions(void)
  {
     return _position;
  }
std::vector_位置(10);
标准::向量获取位置(无效)
{
返回位置;
}
总结 我建议您首先尝试对客户机或用户隐藏阵列实现。如果做不到这一点,最好使用
std::vector
而不是数组。最后使用数组


返回数组时,始终伴随容量变量

如果我在类中有其他数组成员,我希望为其提供公共访问,那么这是否也有效?将
const
抛出是未定义的行为。如果用户足够努力,他们总是可以颠覆期望的行为;这不是在原始数组上使用STL的理由…@Mario您通常不应该在同一个类中混合使用公共和非公共成员访问。常量迭代器如何颠覆您的观点?我可以摆脱被解引用值的常量。我会尝试这个,但我需要检查常量在这个特定上下文中的用法。Thanks@OliCharlesworth:“我在C++中看到了数组使用的其他问题,以及如何更好地使用向量”,这并不表示对代码> STD::数组< /COD>的任何认识,这是这里真正的答案(与<代码> STD::向量< /代码>相反)。您可能希望更改设计以从数组而不是从大数组返回元素。
  double get_one_position(unsigned int index)
  {
    double result = 0.0;
    if (index >= MAX_CAPACITY)
    {
       // Errror handling
    }
    else
    {
      result = _position[index];
    }
    return result;
  }
  std::vector<double> _position(10);
  std::vector<double> get_positions(void)
  {
     return _position;
  }