Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2014, 21:27   #1
DimaR123
 
Регистрация: 05.06.2013
Сообщений: 3
Восклицание Помогите исправить ошибку в программе(С++)

Создать класс Frac(дробные числа) с перегруженными операциями + - * / , а также с возможностью приведения типа Frac->double. Должны быть реализованы также ToString(), Equals(), ==, !=. Вычислить значение полинома в точке. Все коэффициенты и x должны иметь тип Frac.
Вот код
Код:

#include <iostream>
    #include <stdexcept>
    #include <sstream>
      
    struct IComparable {
    virtual bool Equal(const IComparable&) const = 0;
    };
      
    template <typename T>
    T gcd (const T& m, const T& n) {
    return n == 0 ? m : gcd (n, m % n);
    }
      
    class Frac : public IComparable {
    int p, q;
      
    void reduce () {
    int d = gcd (p,q);
    p /= d;
    q /= d;
    if (q < 0) {
    q = -q;
    p = -p;
    }
    }
      
    public:
    Frac (int p=0,int q=1) : p(p), q(q) {
    if (q == 0) throw std::invalid_argument("Делитель равен 0");
    reduce ();
    }
      
    std::string ToString() const {
    std::stringstream s;
    if (q!=1) s << '(';
    if (p>q && p%q)
    s << p/q << ' ' << p%q;
    else
    s << p;
    if (q!=1) s << '/' << q << ')';
    return s.str();
    }
      
    bool operator==(const Frac& other) const {
    return p == other.p && q == other.q;
    }
      
    bool Frac::operator!=(const Frac& other) const {
    return !(*this == other);
    }
      
    bool Equal(const IComparable& other) const {
    const Frac* o = dynamic_cast<const Frac*>(&other);
    return o ? *o == *this : false;
    }
      
    explicit operator double() const { return double(p)/q; }
      
    Frac operator ~() const { return Frac(q,p); }
    Frac operator -() const { return Frac(-p,q); }
      
    Frac& operator +=(const Frac& other) {
    p = p*other.q + other.p*q;
    q *= other.q;
    reduce();
    return *this;
    }
    Frac& operator -=(const Frac& other) {
    return *this += -other;
    }
    Frac& operator *=(const Frac& other) {
    p *= other.p;
    q *= other.q;
    reduce();
    return *this;
    }
    Frac& operator /=(const Frac& other) {
    return *this *= ~other;
    }
    };
      
    Frac operator+(const Frac& lhs, const Frac& rhs) { return Frac (lhs) += rhs; }
    Frac operator-(const Frac& lhs, const Frac& rhs) { return Frac (lhs) -= rhs; }
    Frac operator*(const Frac& lhs, const Frac& rhs) { return Frac (lhs) *= rhs; }
    Frac operator/(const Frac& lhs, const Frac& rhs) { return Frac (lhs) /= rhs; }
      
    Frac polynomial (Frac coef[], size_t n, const Frac& x) {
    if (n==0) return 0;
    Frac result=coef[n-1];
    for (size_t i=n-2; i < n; --i) {
    result *= x;
    result += coef[i];
    }
    return result;
    }
      
    std::string PolynomialToString (Frac poly[], size_t n) {
    std::stringstream s;
    for (size_t i=n-1; i < n; --i) {
    if (poly[i] != 0) {
    if (poly[i] != 1 || i == 0) {
    s << poly[i].ToString();
    if (i > 0)
    s << '*';
    }
    if (i > 0) {
    s << 'x';
    if (i > 1)
    s << "^" << i;
    s << "+";
    }
    }
    }
    return s.str();
    }
      
    int main () {
      
    Frac poly[] = { Frac(3,2), Frac(1,-3), 0, -Frac (2,7) };
    const size_t n = sizeof poly / sizeof poly[0];
      
    Frac x(2,8);
      
    Frac result = polynomial (poly, n, x);
      
    std::cout << PolynomialToString (poly, n) << '=' << result.ToString();
    std::cout << '=' << static_cast<double>(result);
    std::cout << " при x=" << x.ToString();
      
    std::cout << "\n" << (Frac(2,3)/Frac(2,3)).ToString();
    }
Но при компиляции выдает ошибки:

Цитата:
d:\c-+\struct_frac\class_frac\class.cpp( 57): error C2071Frac:perator double: недопустимый класс хранения
1>d:\c-+\struct_frac\class_frac\class.cpp( 100): error C2666: Frac:perator !=: для 2 перегрузок есть подобные преобразования
1> d:\c-+\struct_frac\class_frac\class.cpp( 48): может быть "bool Frac:perator !=(const Frac &) const"
1> или "встроенный оператор C++!=(double, int)"
1> при попытке сопоставить список аргументов "(Frac, int)"
1>d:\c-+\struct_frac\class_frac\class.cpp( 101): error C2666: Frac:perator !=: для 2 перегрузок есть подобные преобразования
1> d:\c-+\struct_frac\class_frac\class.cpp( 48): может быть "bool Frac:perator !=(const Frac &) const"
1> или "встроенный оператор C++!=(double, int)"
1> при попытке сопоставить список аргументов "(Frac, int)"
DimaR123 вне форума Ответить с цитированием
Старый 04.03.2014, 18:28   #2
vvmcpp
Форумчанин
 
Аватар для vvmcpp
 
Регистрация: 11.12.2010
Сообщений: 116
По умолчанию

Пытаюсь разобраться в вашем коде
первую ошибку выдает тут:

Код:
      
 //----------------
      //only declarations of constructors can be `explicit'	  
	  //explicit operator double() const { return double(p)/q; }
	  // только декларация конструктора может быть явной `explicit'	
	explicit operator double() const 
                { 
                    return double(p)/q; 
                }
Вывод какой? Продекларировать например с explicit, реализовать без explicit.

Резон использования ключевого слова explicit >>>>>>


Вторая ошибка:
//-------------
//ambiguous overload for 'operator!=' in '*((+(i * 12u)) + poly) != 0'
// candidates are: operator!=(double, int) <built-in>
//------------- вопрос что сравнивать с чем?
// poly у нас класс типа Frac;

if (poly[i] != 0)
Тут вы сравниваете poly который типа Frac.
Вывод какой? Правильно перегрузить оператор !=, не использовать оператор !=, или как-то преобразовать Frac в целое, с которыми вы их сравниваете. Преобразовать целое в Frac для сравнения.

Такое сравнение почему-то не работает:
Код:
bool Frac::operator!=(const Frac& other) const 
			{
			return !(*this == other);
			}

И еще: где у вас деструктор класса Frac ?

Последний раз редактировалось vvmcpp; 04.03.2014 в 19:41. Причина: дополнение
vvmcpp вне форума Ответить с цитированием
Старый 04.03.2014, 20:53   #3
DimaR123
 
Регистрация: 05.06.2013
Сообщений: 3
По умолчанию

в строчке
Код:
bool Frac::operator!=(const Frac& other) const {
    return !(*this == other);
убрал Frac::,поскольку его там не должно быть.
можете объяснить для чего здесь использовать деструктор, я просто новичок,так что ошибок и недочётов много.
DimaR123 вне форума Ответить с цитированием
Старый 04.03.2014, 21:19   #4
DimaR123
 
Регистрация: 05.06.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от vvmcpp Посмотреть сообщение
Пытаюсь разобраться в вашем коде
первую ошибку выдает тут:

Код:
      
 //----------------
      //only declarations of constructors can be `explicit'	  
	  //explicit operator double() const { return double(p)/q; }
	  // только декларация конструктора может быть явной `explicit'	
	explicit operator double() const 
                { 
                    return double(p)/q; 
                }
Вывод какой? Продекларировать например с explicit, реализовать без explicit.

Резон использования ключевого слова explicit >>>>>>


Вторая ошибка:
//-------------
//ambiguous overload for 'operator!=' in '*((+(i * 12u)) + poly) != 0'
// candidates are: operator!=(double, int) <built-in>
//------------- вопрос что сравнивать с чем?
// poly у нас класс типа Frac;

if (poly[i] != 0)
Тут вы сравниваете poly который типа Frac.
Вывод какой? Правильно перегрузить оператор !=, не использовать оператор !=, или как-то преобразовать Frac в целое, с которыми вы их сравниваете. Преобразовать целое в Frac для сравнения.

Такое сравнение почему-то не работает:
Код:
bool Frac::operator!=(const Frac& other) const 
			{
			return !(*this == other);
			}

И еще: где у вас деструктор класса Frac ?
Был бы очень благодарен,если вы помогли мне решить эти ошибки в программе
DimaR123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите исправить ошибку в программе Antifa Помощь студентам 3 29.04.2009 23:17
Помогите исправить ошибку в программе Paul_AG Общие вопросы C/C++ 12 24.03.2009 19:36
ПОМОГИТЕ исправить ошибку в программе SYL@R Помощь студентам 1 07.12.2008 19:42
ПОМОГИТЕ исправить ошибку в программе SYL@R Помощь студентам 1 21.11.2008 14:48