5

好的,所以我有一个具有“弱类型”IE 的类,它可以存储许多不同的类型,定义为:

#include <string>

class myObject{
   public:
      bool isString;
      std::string strVal;

      bool isNumber;
      double numVal;

      bool isBoolean;
      bool boolVal;

      double operator= (const myObject &);
};

我想像这样重载赋值运算符:

double myObject::operator= (const myObject &right){
   if(right.isNumber){
      return right.numVal;
   }else{
      // Arbitrary Throw.
      throw 5;
   }
}

这样我就可以做到这一点:

int main(){
   myObject obj;
   obj.isNumber = true;
   obj.numVal = 17.5;
   //This is what I would like to do
   double number = obj;
}

但是当我这样做时,我得到:

error: cannot convert ‘myObject’ to ‘double’ in initialization 

在任务中。

我也试过:

int main(){
   myObject obj;
   obj.isNumber = true;
   obj.numVal = 17.5;
   //This is what I would like to do
   double number;
   number = obj;
}

我得到:

error: cannot convert ‘myObject’ to ‘double’ in assignment

有什么我想念的吗?还是根本不可能通过重载来进行这样的转换operator=

4

5 回答 5

12

operator=分配您的类类型的对象时,重载会改变行为。

如果您想提供对其他类型的隐式转换,您需要提供转换运算符,例如

operator double() const
{
    if (!isNumber)
        throw something();
    return numVal;
}
于 2010-01-15T22:42:15.203 回答
7

您真正想要的是转换运算符。

operator double() const { return numVal; }
operator int() const { ...

也就是说,您可能会喜欢boost::variant

于 2010-01-15T22:43:06.923 回答
2

为此,您需要实现从对象到可以转换为双精度对象的转换运算符

于 2010-01-15T22:42:57.173 回答
2

的返回值operator=()不能像您试图演示的那样使用。如果您将重载运算符本身视为一个函数,那么它可能更有意义。

例如:

int main() {
  myObject obj, obj2;
  obj.isNumber = true;
  obj.numVal = 17.5;
  obj2.operator=(obj); // equivalent to obj2 = obj
}

原因number = obj;不起作用是因为您已经定义了myObject::operator=(),而number将使用double::operator=()(好吧,从技术上讲,没有double::operator=(),因为它是基本类型而不是类......在这里和我一起工作)。

有趣的是,这个函数的行为与任何其他函数一样,返回值 ( return right.numval;) 在不使用时会被忽略。然而,返回值可以像任何其他函数的返回值一样被分配或使用,所以如果你真的想要你可以这样做:

int main() {
  myObject obj, obj2;
  obj.isNumber = true;
  obj.numVal = 17.5;
  double number;
  // number = obj; still won't work.
  number = obj2 = obj; // equivalent to number = obj2.operator=(obj)
}

这只是非常有用。正如其他人所提到的,在尝试将对象分配给基本类型时,您真的想研究转换运算符。myObject

于 2010-01-15T23:20:47.187 回答
-1

要使类可分配给双精度,必须以不同方式定义 operator=。

double operator=(myclass&)是错的。

什么会起作用,是在您的班级之外的朋友 operator=,它接受 double 和 myclass&。

于 2010-01-15T22:44:02.990 回答