Вопрос об операторе присваивания в C ++ - PullRequest
1 голос
/ 26 мая 2009

Простите за то, что некоторым может показаться очень простым вопросом, но я имею в виду этот вариант использования:

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 ++?

Ответы [ 5 ]

7 голосов
/ 26 мая 2009

Один из способов сделать это - определить оператор преобразования:

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, чтобы получить тот же результат.

3 голосов
/ 26 мая 2009

Операторы присваивания и конструкторы преобразования предназначены для инициализации объектов вашего класса из объектов других классов. Вместо этого вам нужен способ инициализации объекта какого-либо другого типа с объектом вашего класса. Вот для чего нужен оператор преобразования:

struct fraction {
     //other members here...
     operator double() const { return (double)numerator / denominator;}
     //other members here...
};
2 голосов
/ 26 мая 2009

Вы можете использовать оператор double для преобразования:

struct fraction
{
     operator double() const
      {
         //remember to check for  denominator to 0
          return (double)numerator/denominator;
      }
};
1 голос
/ 26 мая 2009

operator= не имеет к этому никакого отношения, скорее вы хотите добавить в свой struct публичный operator double что-то вроде:

operator double() {
  return ((double) numerator))/denominator;
}
0 голосов
/ 26 мая 2009

С такой большой частью кода это будет ошибка компилятора, поскольку компилятор не умеет преобразовывать структурную дробь в двойное число. Если вы хотите обеспечить преобразование, вам нужно определить operator double(), который будет использоваться компилятором для этого преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...