оператор / перегрузка - PullRequest
       4

оператор / перегрузка

0 голосов
/ 02 декабря 2009

В целях обучения я создаю большой целочисленный класс на C ++. Есть 2 файла:

big_int.h

#ifndef BIG_INT_H
#define BIG_INT_H

#include 

class big_int
{
public:
    big_int(void);
    big_int(char*);
    big_int(QString);

    ~big_int();

    big_int operator+(big_int);
    big_int operator-(big_int);
    big_int operator*(big_int);
    big_int operator/(big_int);
};

#endif // BIG_INT_H


big_int.cpp


#include "big_int.h"

big_int::big_int()
{
}

big_int::big_int(QString str)
{
}

big_int::~big_int()
{
}

big_int operator+(big_int b)
{
    return big_int();
}

big_int operator-(big_int b)
{
    return big_int();
}

big_int operator*(big_int b)
{
    return big_int();
}

big_int operator/(big_int)
{
    return big_int();
}

Qt Creator возвращает: C: / Documents and Settings / Admin / Мои документы / calculator_1_0 / big_int.cpp: 31: ошибка: оператор big_int / (big_int) должен принимать ровно два аргумента. Но оператор / принимает только 1 параметр. Что не так?

Ответы [ 6 ]

5 голосов
/ 02 декабря 2009

укажите имя класса в соответствии с предложением @ TheSamFrom1984.

OR Укажите операторы, которые принимают два параметра для big_int.

class big_int
{
public:
    big_int(void);
    big_int(char*);
    big_int(std::string);

    ~big_int();

    friend big_int operator+(big_int, big_int);
    friend big_int operator-(big_int, big_int);
    friend big_int operator*(big_int, big_int);
    friend big_int operator/(big_int, big_int);
};
3 голосов
/ 02 декабря 2009

Это опечатка, вы забыли название класса:

big_int big_int::operator+(big_int b)
{
    return big_int();
}

big_int big_int::operator-(big_int b)
{
    return big_int();
}

big_int big_int::operator*(big_int b)
{
    return big_int();
}

big_int big_int::operator/(big_int)
{
    return big_int();
}

Кстати, вместо значений вы должны использовать ссылки:

big_int big_int::operator/(const big_int& v)
{
    //...
}
1 голос
/ 02 декабря 2009

Обычно лучше объявить операторы, принимающие два операнда как свободные функции вне класса, и объявить внутри класса соответствующую версию X=. Например:

class big_int
{
public:
  big_int& operator += (const big_int& rhs);
};

big_int operator + (const big_int& lhs, const big_int& rhs);

big_int& big_int::operator += (const big_int& rhs)
{
    ...
    return *this;
}

big_int operator + (const big_int& lsh, const big_int& rhs)
{
    big_int rc(lhs);
    rc += rhs;
    return rc;
}
0 голосов
/ 02 декабря 2009

Здесь уже достаточно объяснений, как это исправить, но, как замечание, хорошо понять, почему вы получили ошибку компилятора только для оператора /. Первые три оператора +, - и * также являются унарными операторами, которые принимают только один аргумент, например:

int x = 3;
int y = +x; // unary + operator
int z = -x; // unary - operator
int *p = &x;
int q = *p; // unary * operator

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

0 голосов
/ 02 декабря 2009

Вы забыли предварительно добавить определения методов оператора с квалификатором имени класса. Они должны выглядеть так:

bigint bigint::operator/(big_int) <br>{ //method body }

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

0 голосов
/ 02 декабря 2009

Вам необходимо указать класс для каждой из функций.

Так измените:

big_int operator+(big_int b)

до:

big_int big_int::operator+(big_int b)

В противном случае необходимо указать 2 параметра для операторов, которые работают с 2 значениями, такими как +, *, /, ...

Но так как вы поместили объявление всех операторов в ваш класс, я думаю, что вы хотите мое первое предложение.

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