很抱歉,如果之前有人问过,但我找不到足够明确的答案。
在C ++中提供对数组成员的公共只读访问权的正确方法是什么?
如果我有类似以下的课程:
class Particle
{
double _position[10];
public:
double* get_position()
{
return _position;
}
};
我觉得返回一个指向数组的指针真的很糟糕,因为这意味着它可以被改变 在类之外的任何时候,是否足以返回一个const指针?
我已经看到了有关在C ++中使用数组的其他问题,以及如何使用向量是一个更好的选择,但我对这个问题非常好奇。
你可以看到我只是一个C ++菜鸟,如果这是一个愚蠢的问题,对不起。
Pd积。抱歉我的英语不好。
答案 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
用于数组。最后使用一个数组。
返回数组时,始终会随附容量变量。