C ++封装数组

时间:2011-04-08 17:22:23

标签: c++ arrays encapsulation

很抱歉,如果之前有人问过,但我找不到足够明确的答案。

在C ++中提供对数组成员的公共只读访问权的正确方法是什么?

如果我有类似以下的课程:

   
class Particle
{
    double _position[10];

public:
    double* get_position()
    {
       return _position;
    }
};
   

我觉得返回一个指向数组的指针真的很糟糕,因为这意味着它可以被改变 在类之外的任何时候,是否足以返回一个const指针?

我已经看到了有关在C ++中使用数组的其他问题,以及如何使用向量是一个更好的选择,但我对这个问题非常好奇。

你可以看到我只是一个C ++菜鸟,如果这是一个愚蠢的问题,对不起。

Pd积。抱歉我的英语不好。

6 个答案:

答案 0 :(得分:7)

返回const *并不是更好,因为调用者可以将常量转换掉。

考虑提供const Iterator而不是返回指针。这使您的类用户可以访问位置,而不会暴露实现细节。如果您以后想要从固定长度数组切换到STL容器,则可以这样做而不会影响该类用户。

答案 1 :(得分:4)

您可以返回一个const指针:

class Particle
{
    double _position[10];

public:
    const double* get_position() const
    {
       return _position;
    }
};

请注意,我还创建了成员函数const(第二个const),告诉编译器可以在const Particle个实例上调用此成员函数。

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

答案 2 :(得分:2)

不要使用原始数组;总是更喜欢std::array<>(或boost::array<>,如果您的编译器不够新,可以附带std::std::tr1::实现):

class Particle
{
public:
    typedef std::array<double, 10> positions_t;

    Particle() : positions_() { }

    positions_t& get_positions() { return positions_; }
    positions_t const& get_positions() const { return positions_; }

private:
    positions_t positions_;
};

答案 3 :(得分:0)

是的,返回一个指向数组(或数组元素)的const指针。

const double* get_position() const
{
    return _position;
} 

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

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

private:
    int             errcode;
    ...
}

(如果语法不正确,请道歉。)
这允许Foo的客户端读取Foo::err,但不能修改Foo::errcode,这是对实际私有错误代码{{1}}的const引用,可以通过类的成员函数进行修改

答案 4 :(得分:0)

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

const double ( &get_position() const )[10] { return position; }

当然,您可能希望使用typedef来更容易阅读。

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

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

答案 5 :(得分:0)

至少有三个问题/评论:

  • 返回数组
  • 返回元素
  • 返回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 ++中,首选std::vector为数组。您的问题是切换的一个原因。 std::vector可以传递给方法并从方法返回。此外,std::vector维护自己的容量变量,因此不需要传递容量和数组指针。

  std::vector<double> _position(10);
  std::vector<double> get_positions(void)
  {
     return _position;
  }

摘要

我建议您首先尝试从客户端或用户隐藏数组实现。如果无法做到这一点,请更喜欢将std::vector用于数组。最后使用一个数组。

返回数组时,始终会随附容量变量。