我正在使用的示例类:
class Vector
{
double val[3];
public:
double & operator [] (const unsigned int & index) {return this->val[index];};
}
然后我称之为:
Vector Example;
Example[0]=5;
使用像这样的运算符重载是正确的还是反对封装,我应该使用不同的东西?我在这里使用私有值的引用,我不确定这个实现。
答案 0 :(得分:1)
到目前为止很好......你还需要一个可以从const对象中读取的东西。此外,没有理由通过const&传递数组索引。另外,class Vector
{
double val[3];
public:
double& operator [] (size_t index) {return val[index];};
const double& operator [] (size_t index) const {return val[index];};
};
是隐含的。查看std::vector<>的成员函数签名。特别是operator[]。推送请求......
{{1}}
答案 1 :(得分:0)
这是你的抽象漏洞。它暴露了您可以读取或写入的实际double
这一事实。
如果您以后想要将这些double
更改为远程直接网络连接数据或存储在数据库中,您将被迫向界面添加重大更改。
话虽如此:
值得。您可能永远不会修改此类型来执行疯狂的操作,并且存在大量的编译,设计和运行时开销以实现无限制的抽象。
抽象和封装是有目的的并且有成本。
std::vector<bool>
的{{1}}是您在引用返回类型不正常时可以执行的操作的示例。它用于返回子字节元素。请注意,它被广泛认为是设计错误。