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

Компилятор просит указать const в конструкторе - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ MessageBox API http://www.cyberforum.ru/cpp-beginners/thread629083.html
MessageBox API: не получаеться обработать выбор. Мой код: int SELECT = MessageBox(hwnd, _T("Вы действительно хотите завершить работу программы? ВНИМАНИЕ! В случае завершения работы программы, клиенты не смогут подключиться."), _T("Завершение работы"), MB_OKCANCEL | MB_ICONQUESTION); if (SELECT = MB_OK) { PostQuitMessage(0); }
C++ Перегрузка потокового оператора (<<). Выдает адрес вместо значения Сабж. Все компелится нормально. Если делать << void то работает ок см комменты если делать класса std::ostream& то возвращает 16чное значение. Заранее спасибо #ifndef Point_HPP // anti multiply including gates #define Point_HPP #include <sstream> http://www.cyberforum.ru/cpp-beginners/thread629067.html
C++ Реализовать шаблонный класс
В общем требуется реализовать шаблонный класс FixedArray<T,N> FixedArray - абстракция вокруг T Использование выглядит как то так: FixedArray<std::vector, 8> myArr1 = {1, 2, 3, 4}; FixedArray<std::string, 8> strArr = {"a", "b", "c", "d"};
stdlib.h - quicksort C++
Идея такова: отсортировать массив A очень быстрым методом Хоара. Пробовал в stdlib.h делать QuickSort - ничего не получилось. Все значения элементов - до 263-1. Т.е. влазят в тип long. Помогите отсортировать!
C++ KeyDown обрабатывает только символы http://www.cyberforum.ru/cpp-beginners/thread629012.html
Всем привет. Собственно сам вопрос, когда я вызываю функцию (пишу на WinApI, но вопрос из основ c++) Она реагирует только на буквы, цифры, а мне нужно ещё VK_LEFT, VK_RIGHT. Но почему то эта функция их не обрабатывает, вопрос почему. void CMovingBallDlg::KeyD(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags) { switch (wP) { case (VK_LEFT)://сообщение не обрабатывается {...
C++ Написать dll для дальнейшего использования в программах на других языках как правильно написать dll чтоб ей можно было пользоваться программам на других языках, например, на delphi подробнее

Показать сообщение отдельно
moskitos80
61 / 61 / 10
Регистрация: 04.10.2011
Сообщений: 217
Завершенные тесты: 1

Компилятор просит указать const в конструкторе - C++

26.07.2012, 14:48. Просмотров 1832. Ответов 33
Метки (Все метки)

Всем привет. Изучаю С++ по Р.Лафоре. В одном из заданий, к главе 8 понадобилось написать класс, представляющий простую дробь, и написать перегруженные операторы: -, +, * и /. Собственно проблем никаких - написал, перегрузил. Решил перегрузить заодно и оператор присваивания, путём указания соответствующего конструктора с одним аргументом того же типа:

C++
1
2
3
4
5
6
... код ...
Fract(Fract fr) : 
    num (fr.getNum()),
    den (fr.getDen())
{}
... код ...
И тут компилятор начинает ругается и намекать : invalid constructor; you probably meant `Fract (const Fract&)' После этого делаю как он просит:

C++
1
2
3
4
5
6
... код ...
Fract(const Fract& fr) : 
    num (fr.getNum()),
    den (fr.getDen())
{}
... код ...
И всё окей... Уважаемые, объясните пожалуйста, что это за правила такие действуют в данной ситуации? Почему здесь требуется указать const и обязательно передать аргумент по ссылке?

Вот листинг программы целиком:

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <iostream>
 
using namespace std;
 
////////////////////////////////////////////////////////////////////////////////
// Класс, представляющий простую дробь
 
class Fract {
      private : 
              int num, // числитель
                  den; // знаменатель
      public :
             // Для перегрузки оп-ции "="
             // Fract(Fract fr)       : - Не работает!!!
             // Fract(const Fract fr) : - Тоже не работает!!!
             Fract(const Fract& fr) : 
                     num (fr.getNum()),
                     den (fr.getDen())
             {}
             Fract(int n, int d) : 
                     num (n),
                     den (d)
             {}
             
             // Аксессор для числителя
             int getNum(void) const;
             // Аксессор для знаменателя
             int getDen(void) const;
             // Вывести на консоль значение в виде x/x
             void show(void) const;
             // Сокращение дроби
             Fract lowterms(void);
             
             Fract operator +(const Fract&) const;
             Fract operator -(const Fract&) const;
             Fract operator *(const Fract&) const;
             Fract operator /(const Fract&) const;
             
             bool operator ==(Fract) const;
             bool operator !=(Fract) const;
};
int Fract::getNum(void) const{
    return this->num;
}
int Fract::getDen(void) const{
    return this->den;
}
void Fract::show(void) const {
     cout << this->num << "/" << this->den;  
}
Fract Fract::lowterms(void){
      int div = this->den;
      while (div > 1) {
            // Если числ. и знам. делятся на одно и тоже число без остатка...
            if (this->num % div == 0 && this->den % div == 0) {
                  // Сокращаем:
                  this->num /= div;  
                  div = this->den /= div;   
            }
            div--;
      }
      // Это телодвижение для того, чтобы можно было вызывать этот метод
      // с оператором return в перегруженных операторах:
      // "+", "-", "*", "/" т.е. возвращать уже сокращённую дробь и в 
      // результате возвращать требуемый тип.
      return Fract(this->num, this->den);
}
Fract Fract::operator +(const Fract& fr2) const{
      return Fract(
             (this->num * fr2.getDen() + fr2.getNum() * this->den),
             (this->den * fr2.getDen())
      ).lowterms();
}
Fract Fract::operator -(const Fract& fr2) const{
      return Fract(
             (this->num * fr2.getDen() - fr2.getNum() * this->den),
             (this->den * fr2.getDen())
      ).lowterms();
}
Fract Fract::operator *(const Fract& fr2) const{
      return Fract(
             (this->num * fr2.getNum()),
             (this->den * fr2.getDen())
      ).lowterms(); 
}
Fract Fract::operator /(const Fract& fr2) const{
      return Fract(
             (this->num * fr2.getDen()),
             (this->den * fr2.getNum())
      ).lowterms(); 
}
bool Fract::operator ==(Fract fr2) const{
      Fract fr1(this->num, this->den);
      fr1.lowterms();
      fr2.lowterms();
      return (fr1.getNum() == fr2.getNum() && fr1.getDen() == fr2.getDen());
}
bool Fract::operator !=(Fract fr2) const{
      Fract fr1(this->num, this->den);
      fr1.lowterms();
      fr2.lowterms();
      return (fr1.getNum() == fr2.getNum() && fr1.getDen() != fr2.getDen());      
}
////////////////////////////////////////////////////////////////////////////////
 
int main()
{
   Fract fr1(2,3), 
         fr2(4,6), 
         fr3 = fr1 + fr2; 
         
   fr3.show();
   
   cout << endl;   
   system("PAUSE");
   return EXIT_SUCCESS;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru