Как перегрузить «оператор%» в с ++ - PullRequest
3 голосов
/ 25 августа 2011

Я хочу перегрузить оператор% в c ++, чтобы избежать редактирования огромного блока кода вручную.Я попробовал это:

static float operator %(const float& left, const float& right);

В моем заголовке, но это не сработает, потому что «оператору без члена требуется параметр с классом или типом перечисления».Я относительно новичок в C ++, что мне делать?

Ответы [ 4 ]

14 голосов
/ 25 августа 2011

Операторские перегрузки должны иметь хотя бы один из своих аргументов в качестве пользовательского типа.Таким образом, вы не можете сделать это.

3 голосов
/ 25 августа 2011

Это означает, что вы не можете перегрузить оператор, когда все операнды не относятся к типу / перечислению.то есть вы не можете переопределить поведение %, когда обе стороны float (или int, или любой другой тип примитива).

2 голосов
/ 25 августа 2011

Как уже было сказано, вы не можете определить перегруженные операторы для внутренних типов.

Однако, если вы хотите воспользоваться неявным преобразованием типов, вы можете достичь чего-то близкого к тому, что вам нужно, с помощью одного приведения к одному из ваших типов с плавающей запятой, который реализует перегруженный оператор%.

class FloatWrapper
{
private:
    float m_Float;

public:
    FloatWrapper(float Value):
      m_Float(Value)
    {
    }

    friend float operator%(const FloatWrapper& lhs, const FloatWrapper& rhs)
    {
        //your logic here...
        return (int)lhs.m_Float % (int)rhs.m_Float;
    }
};

int main()
{
float Value1 = 15.0f;
float Value2 = 4.0f;

float fMod1 = (FloatWrapper)Value1 % Value2;
float fMod2 = Value1 % (FloatWrapper)Value2;
return 0;
}
0 голосов
/ 25 августа 2011
class Test
{
public:
     float operator%(float);
};

В C ++ вам не нужно объявлять оператор как статический, в отличие от C #.Аргумент может быть любого типа, и возвращаемое значение также может быть.Первым типом будет сам класс.

Пример:

Test test;
float x = test % 10.2f;
...