1

请原谅在某些人看来是一个非常简单的问题,但我想到了这个用例:

struct fraction {
    fraction( size_t num, size_t denom ) : 
        numerator( num ), denominator( denom )
    {};
    size_t numerator;
    size_t denominator;
};

我想做的是使用如下语句:

fraction f(3,5);
...
double v = f; 

现在拥有v我的分数所代表的价值。我将如何在 C++ 中做到这一点?

4

5 回答 5

7

一种方法是定义一个转换运算符:

struct fraction
{
  size_t numerator;
  size_t denominator;

  operator float() const
  {
     return ((float)numerator)/denominator;
  }
};

大多数人宁愿不将隐式转换运算符定义为样式问题。这是因为转换运算符倾向于“在幕后”行动,并且很难判断正在使用哪些转换。

struct fraction
{
  size_t numerator;
  size_t denominator;

  float as_float() const
  {
     return ((float)numerator)/denominator;
  }
};

在此版本中,您将调用该as_float方法以获得相同的结果。

于 2009-05-26T04:41:45.870 回答
3

赋值运算符和转换构造函数用于从其他类的对象初始化您的类的对象。相反,您需要一种方法来使用您的类的对象来初始化其他类型的对象。这就是转换运算符的用途:

struct fraction {
     //other members here...
     operator double() const { return (double)numerator / denominator;}
     //other members here...
};
于 2009-05-26T04:45:01.450 回答
2

您可以使用运算符 double 进行转换:

struct fraction
{
     operator double() const
      {
         //remember to check for  denominator to 0
          return (double)numerator/denominator;
      }
};
于 2009-05-26T04:43:54.447 回答
1

operator=与它无关,而是你想向你struct的公众添加类似的operator double东西:

operator double() {
  return ((double) numerator))/denominator;
}
于 2009-05-26T04:40:46.637 回答
0

使用这么多代码将是编译器错误,因为编译器不知道如何将 struct fraction 转换为 double。如果要提供转换,则必须定义operator double()编译器将用于此转换的转换。

于 2009-05-26T04:42:55.493 回答