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;
}