【问题标题】:Overloading operator in class and returning reference to private value重载类中的运算符并返回对私有值的引用
【发布时间】:2018-03-19 12:41:30
【问题描述】:

我正在使用的示例类:

class Vector
{
double val[3];
public:
double & operator [] (const unsigned int & index) {return this->val[index];};
}

那我这样称呼它:

Vector Example;
Example[0]=5;

像这样使用运算符重载是正确的还是它反对封装,我应该使用不同的东西?我在这里使用对私有值的引用,我不确定这个实现。

【问题讨论】:

  • std::vector 的索引基本上是这样工作的。
  • Setter 和 getter 恕我直言。这看起来很好并且具有预期的行为。我唯一的建议是将其写为double& operator[](std::size_t index) {return val[index];}。另请注意,您不需要在内联函数末尾的 ;
  • 一旦您返回一个非常量引用,您也可以将成员设为公开,但这取决于您实际想要实现的目标
  • 您当前的代码有错误吗?
  • 感谢您的回答。没有错误,我只是想有良好的编程习惯,所以才问。

标签: c++ class oop operator-overloading encapsulation


【解决方案1】:

到目前为止很好...您还需要一个可以从 const 对象中读取的数据。此外,没有理由通过 const& 传递数组索引。此外,this-&gt; 是隐含的。查看std::vector<> 的成员函数签名。特别是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];};
};

【讨论】:

    【解决方案2】:

    这是您的抽象中的一个漏洞。它暴露了您拥有可以读取或写入的实际 doubles 的事实。

    如果您以后想将这些doubles 更改为远程即时网络连接数据或存储在数据库中,您将不得不向您的界面添加重大更改。

    话虽如此:

    这是值得的。你可能永远不会修改这种类型来做一些疯狂的事情,并且无限抽象会产生大量的编译、设计和运行时开销。

    抽象和封装是有目的的,也是有代价的。

    std::vector&lt;bool&gt;operator[] 是在引用返回类型不正确时可以执行的操作的示例。它用于返回子字节元素。请注意,这被广泛认为是设计错误。

    【讨论】:

    • std::vector 抽象中的相同泄漏。它允许像vec[3] = 42; 这样的语句
    • @JiveDadson 向量泄漏的远不止这些;它保证了一个连续的缓冲区。
    • OP 也是如此。这些都是好东西,imo。
    • @JiveDadson 不,OP 的 API 不保证连续缓冲区。 class Foo { double v1, v2; int x; double v3; public: double&amp; operator[](unsigned x) const { if (x==0) return v1; if (x==1) return v2; if (x==2) return v3; } }; -- 相同的 API,不是连续的缓冲区。但是,您不能在不实际存储双精度值的情况下提供该 API。另一方面,vectorT* data()(加上其他保证)。请注意,我不是在评判,我是在描述。
    • double val[3] 是连续的。这就是我的意思。可悲的事实是,没有标准的方法来确定容器是否使用连续内存。委员会正在为此苦苦挣扎。这种情况下的设计错误是迭代器类别不应该存在。迭代器特征(包括 is_contiguous_v、can_index_forward_v 等)会更可取。
    猜你喜欢
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2017-07-09
    相关资源
    最近更新 更多