在 class 中重载运算符并返回对私有值的引用
Overloading operator in class and returning reference to private value
示例class我正在使用:
class Vector
{
double val[3];
public:
double & operator [] (const unsigned int & index) {return this->val[index];};
}
然后我这样称呼它:
Vector Example;
Example[0]=5;
像这样使用运算符重载是正确的还是违反封装的,我应该使用不同的东西?我在这里使用了对私有值的引用,我不确定这个实现。
这是你抽象中的漏洞。它揭示了您拥有可以读取或写入的实际 double
的事实。
如果您稍后想将这些 double
更改为远程即时网络连接数据或存储在数据库中,您将被迫向您的界面添加重大更改。
也就是说:
值得。你可能永远不会修改这种类型来做一些疯狂的事情,而且无限抽象有很大的编译、设计和运行时开销。
抽象和封装是有目的的,也是有代价的。
std::vector<bool>
的 operator[]
是当引用 return 类型不正确时您可以做什么的示例。那里是用来 return sub-byte 元素的。请注意,它被广泛认为是设计错误。
到目前为止还不错...您还需要一个可以读取 const 对象的程序。此外,没有理由通过 const& 传递数组索引。同样, this->
是隐含的。查看 std::vector<>. In particular operator[] 的成员函数签名。推送请求...
class Vector
{
double val[3];
public:
double& operator [] (size_t index) {return val[index];};
const double& operator [] (size_t index) const {return val[index];};
};
示例class我正在使用:
class Vector
{
double val[3];
public:
double & operator [] (const unsigned int & index) {return this->val[index];};
}
然后我这样称呼它:
Vector Example;
Example[0]=5;
像这样使用运算符重载是正确的还是违反封装的,我应该使用不同的东西?我在这里使用了对私有值的引用,我不确定这个实现。
这是你抽象中的漏洞。它揭示了您拥有可以读取或写入的实际 double
的事实。
如果您稍后想将这些 double
更改为远程即时网络连接数据或存储在数据库中,您将被迫向您的界面添加重大更改。
也就是说:
值得。你可能永远不会修改这种类型来做一些疯狂的事情,而且无限抽象有很大的编译、设计和运行时开销。
抽象和封装是有目的的,也是有代价的。
std::vector<bool>
的 operator[]
是当引用 return 类型不正确时您可以做什么的示例。那里是用来 return sub-byte 元素的。请注意,它被广泛认为是设计错误。
到目前为止还不错...您还需要一个可以读取 const 对象的程序。此外,没有理由通过 const& 传递数组索引。同样, this->
是隐含的。查看 std::vector<>. In particular operator[] 的成员函数签名。推送请求...
class Vector
{
double val[3];
public:
double& operator [] (size_t index) {return val[index];};
const double& operator [] (size_t index) const {return val[index];};
};