C++运算符[]

che*_*hen 4 c++ operator-overloading c++11

我正在尝试实现一次用于Set的运算符[]和一次用作Get,我需要区分这两种情况,就像get的情况一样,如果返回的值相等,我需要抛出一个异常到-1; 而在Set i的情况下,只需覆盖该值.appple [2] = X; Y =苹果[2];

我不知道如何区分这两种模式,我的功能签名是:

   double& Security::operator[](QuarterType index){
    if(index<0 || index>MAX_QUATERS){
        throw ListExceptions::QuarterOutOfBound();
    }
    return evaluation[index].getValueAddress();
   }
Run Code Online (Sandbox Code Playgroud)

小智 6

与python或C#等语言不同,C++不为其运算符提供get和set模式.因此,您必须编写operator[]它以便在您希望使用它的任何上下文中使用它时返回一个正确的对象,这通常意味着引用.

注意我经常说; 您还可以执行其他操作,例如返回具有以下成员的类的实例:

struct proxy
{
    operator double() const;
    void operator=(double x);
};
Run Code Online (Sandbox Code Playgroud)

如果在期望double的上下文中使用此代理对象,它将调用隐式转换运算符,该运算符用于执行get运算.类似地,如果有人分配给代理对象,它将调用赋值运算符,该运算符用于执行set操作.

(请注意,代理可能需要对您的Security对象的引用)

然而,这种方法并非没有困难; 由于您的返回值不是类型doubledouble&类似的,它可能会导致与重载决策混淆,特别是对于模板函数,并且在使用时会引起很多混淆auto.而您的代理对象甚至无法在需要的上下文中使用double&!

因此,这是一种最后的手段,当你被支持到一个角落并且必须按照operator[]假装工作的方式进行访问时double.在你诉诸于此之前,你真的应该寻求其他选择,例如:

  • 重新设计程序,以便索引Security对象只能返回对doubles的引用,而不需要更复杂的get和set操作.(例如,更改不变量,以便没有异常数据,或者在其他地方进行错误处理)
  • 结算使用专用的get和set操作.甚至给他们更复杂的名字,以反映他们正在做的事情比通常认为的索引集合更为重要.
  • 重新设计API,以便用户期望获得operator[]具有各种非平凡行为的代理对象,而不是期望operator[]用于读/写double对象.


pet*_*hen 4

C++ 不容易区分

appple[2] = X; 
y=apple[2];
Run Code Online (Sandbox Code Playgroud)

最常见的解决方案是返回一个代理对象:

struct AppleProxy
{
   Security & obj; 
   unsigned index;

   AppleProxy(Security &, unsigned) : ... {}

   operator double()   // your getter
   {
      return obj.GetAt(index);
   }

   operator=(double rhs)
   {
      obj.SetAt(index, rhs);
   }
}

AppleProxy operator[](unsigned index) { return AppleProxy(*this, index); }
Run Code Online (Sandbox Code Playgroud)

代理需要非常注意细节,我省略了const正确性、生命周期管理、获取 ( ) 的地址double & x = apple[2]; x = 17;等。

由于陷阱的存在,我倾向于避免它们。