Форум программистов, компьютерный форум CyberForum.ru

Ошибка при перегрузке операторов - C++

Восстановить пароль Регистрация
 
FrozenFox
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 7
01.12.2011, 00:45     Ошибка при перегрузке операторов #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <conio.h>
 
class fraction
{
public:
    int numerator;
    int denominator;
    fraction();
    fraction(int i){
        numerator=i;
        denominator=1;
    }
    fraction(int i, int j){
        numerator=i;
        denominator=j;
    }
    void out(){
        if(denominator==1)
            printf("%i",numerator);
        else
            printf("%i/%i",numerator,denominator);
    }
    fraction operator+(fraction i){
        fraction res;
        res.denominator=denominator*i.denominator;
        res.numerator=numerator*i.denominator+i.numerator*denominator;
        return res;
    }
};
 
 
 
 
void main()
{
    int i=2,j=3;
    fraction z(i,j),x(j,i),y;
    y=z+x;
 
 
    y.out();
    
 
 
    getch();
}
Добавлено через 1 минуту
логи:
1>------ Построение начато: проект: laba5, Конфигурация: Debug Win32 ------
1>Построение начато 01.12.2011 2:23:00.
1>InitializeBuildStatus:
1> Обращение к "Debug\laba5.unsuccessfulbuild".
1>ClCompile:
1> main.cpp
1>c:\users\frozenfox\documents\visual studio 2010\projects\laba5\laba5\main.cpp(46): warning C4996: 'getch': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\conio.h(128): см. объявление "getch"
1>ManifestResourceCompile:
1> Для всех выходных данных обновления не требуется.
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall fraction::fraction(void)" (??0fraction@@QAE@XZ) в функции _main
1>C:\Users\FrozenFox\Documents\Visual Studio 2010\Projects\laba5\Debug\laba5.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
1>
1>СБОЙ построения.
1>
1>Затраченное время: 00:00:00.50
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========




и есчо вопросик: почему на гетч выдаются варнинги?
потому, что считается ненадежной функцией как сканф или принтф?

Добавлено через 18 минут
использую visual studio 2010
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
01.12.2011, 00:55     Ошибка при перегрузке операторов #2
Цитата Сообщение от FrozenFox Посмотреть сообщение
C++
1
fraction();
а где реализация конструктора по-умолчанию?

Добавлено через 3 минуты
Цитата Сообщение от FrozenFox Посмотреть сообщение
и есчо вопросик: почему на гетч выдаются варнинги?
потому, что считается ненадежной функцией как сканф или принтф?
Ну английским языком же написано, что данное POSIX имя является устаревшим. Надо использовать ISO C++ вариант.
Rexer
 Аватар для Rexer
151 / 150 / 19
Регистрация: 10.10.2010
Сообщений: 691
01.12.2011, 01:01     Ошибка при перегрузке операторов #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include<stdio.h>
 
class fraction
{
public:
        int numerator;
        int denominator;
        fraction(){
                numerator=0;
                denominator=0;
};
        fraction(int i){
                numerator=i;
                denominator=1;
        }
        fraction(int i, int j){
                numerator=i;
                denominator=j;
        }
        void out(){
                if(denominator==1)
                        printf("%i",numerator);
                else
                        printf("%i/%i",numerator,denominator);
        }
        fraction operator+(fraction i){
                fraction res;
                res.denominator=denominator*i.denominator;
                res.numerator=numerator*i.denominator+i.numerator*denominator;
                return res;
        }
};
 
 
 
 
int main()
{
        int i=2,j=3;
        fraction z(2,3);
        fraction x(2,3);
        fraction y;
        y=z+x;
 
 
        y.out();
getchar();
}
Ну вот так работает
Конструктор по умолчанию определите и  все заработает
вместо getch() лучше пользуйтесь getchar(); что по сути одно и то же
FrozenFox
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 7
01.12.2011, 01:09  [ТС]     Ошибка при перегрузке операторов #4
спасибо большое =)
теперь, завтра на лабе, я сдам самую лучшую программу вычисления обратной матрицы методом гаусса ^_^
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
01.12.2011, 01:17     Ошибка при перегрузке операторов #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
fraction() {
        numerator=0;
        denominator=0;
};
 
fraction(int i) {
        numerator=i;
        denominator=1;
}
 
fraction(int i, int j) {
        numerator=i;
        denominator=j;
}
Все это добро можно заменить одним конструктором:
C++
1
2
3
4
fraction(int i = 0, int j = 1) {
        numerator = i;
        denominator = j;
}
И еще неплохо бы обрабатывать момент, когда пользователь пытается создать объект с denominator равным 0.
Rexer, а у Вас, кстати, создается как раз с нулем
FrozenFox
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 7
01.12.2011, 01:37  [ТС]     Ошибка при перегрузке операторов #6
fasked, спасибо, что предупредили, наша преподавательница могла попробовать это использовать, чтобы поиздеваться =)


ну, это исправляется на лету =)

Добавлено через 59 секунд
если пытается знаменатель занулить, насильно ставим еденицу)

Добавлено через 1 минуту
если пытается знаменатель занулить, насильно ставим еденицу)

а раз нет нулей, то в перегрузку умножения и деления проверку на зануливание деноминатора можно не ставить)

Добавлено через 7 минут
оО теперь осталось научиться выделять динамическую память под объекты класса хД

Добавлено через 6 минут
а еще придумал упрощение дроби вставить в конструктор дабы исключить случай переполнения типа инт)
охохо... дорого же будет использовать этот класс..... при создании нового объекта цикл... а если использовать массив дробей (fraction)?...
жаба душит
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2011, 01:51     Ошибка при перегрузке операторов
Еще ссылки по теме:

Сколько используется параметров при перегрузке унарных операторов как френд-функций? C++
C++ Ошибка в перегрузке операторов?
Можно ли при перегрузке операторов задавать дополнительные параметры? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
01.12.2011, 01:51     Ошибка при перегрузке операторов #7
Цитата Сообщение от FrozenFox Посмотреть сообщение
а еще придумал упрощение дроби вставить в конструктор дабы исключить случай переполнения типа инт
В конструкторе переполнения быть не может. Принимается int и присваивается значение другому int.
Yandex
Объявления
01.12.2011, 01:51     Ошибка при перегрузке операторов
Ответ Создать тему
Опции темы

Текущее время: 16:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru