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

не компилит простой код c++ - C++

Восстановить пароль Регистрация
 
osrcproject
3 / 3 / 0
Регистрация: 01.05.2012
Сообщений: 14
01.05.2012, 16:57     не компилит простой код c++ #1
Вот этот код не компилится. Почему, ума не прилажу :-( Подскажите в чём проблема?
Английский ещё плохо знаю, не посылайте плиз на англоязычные ресурсы.
Компилятор g++ (Debian 4.4.5-8) 4.4.5
point.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef POINT_H
#define POINT_H
 
class point {
public:
        point(float _x = 0.0, float _y = 1.0);
        point(point&);
        float x, y;
        point operator+(point&);
};
point::point(float _x, float _y):
        x(_x), y(_y)
{
}
point::point(point &p):
        x(p.x), y(p.y)
{
}
point point::operator+(point &p){
        return point(x + p.x, y + p.y);
}
#endif
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include "point.h"
 
using std::cout;
using std::endl;
 
int main(int argc, char** argv)
{
        point t(5.2332, 23.52);
        point s(t);
        point p = t + s;
        cout << "x=" << p.x << endl << "y=" << p.y << endl;     
        return 0;
}
In file included from main.cpp:2:
point.h: In member function ‘point point::operator+(point&)’:
point.h:20: error: no matching function for call to ‘point::point(point)’
point.h:15: note: candidates are: point::point(point&)
point.h:11: note: point::point(float, float)
main.cpp: In function ‘int main(int, char**)’:
main.cpp:11: error: no matching function for call to ‘point::point(point)’
point.h:15: note: candidates are: point::point(point&)
point.h:11: note: point::point(float, float)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.05.2012, 16:57     не компилит простой код c++
Посмотрите здесь:

Помогите улучшить простой код C++
C++ простой код
Почему не компилит C++
Простой код но выдает ошибку C++
Некомпилится простой код! C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
01.05.2012, 18:36     не компилит простой код c++ #2
конструктор копирования кривой. желательно чтобы он принимал константную ссылку, а не ссылку. иначе возникают такие вот ошибки, когда неявно вызывается конструктор копирования и ему пытаются подсунуть временный объект. а передача временных объектов во неконстантной ссылке запрещена. в общем сигнатуру конструктора копирования такую сделайте:
C++
1
pint(const point& p);
для оператора + то же. и везде, где не предполагается изменять передаваемый объект - везде он должен передаваться по константной ссылке. а если функция не изменяет состояние класса - она должна быть константной. ваш оператор + состояние класса не изменяет. а вообще его лучше сделать свободной функцией.

Кстати, в этом конкретном случае свой конструктор копирования писать не надо. Тот, что генерирует компилятор вполне подойдет.
osrcproject
3 / 3 / 0
Регистрация: 01.05.2012
Сообщений: 14
01.05.2012, 19:19  [ТС]     не компилит простой код c++ #3
А почему, или лучше каким образом компилятор сам генерирует конструктор копирования?
Добавил константное объявление ссылки, заработало, но почему? Я уже несколько дней над этой проблемой бьюсь всё никак не пойму? Как понять когда можно, когда нельзя, а когда нужно делать ссылки константными?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
01.05.2012, 19:37     не компилит простой код c++ #4
Конструктор копирования и оператор = для классов всегда успешно генерится, если у мемберов классов есть соответствующие конструктор\оператор и они не константные (?). у вашего point в мемберах только встроенные типы - а для них операции копирования и присваивания простые. значит все по умолчанию нормально сгенерируется и будет работать корректно.

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

С оператором + тот же самый здравый смысл.
C++
1
2
3
4
5
6
7
8
9
point p1;
point p2;
point p3 = p2 + p3;
//В результате такого сложения p2 и p3 не изменяются ведь. значит point::operator + (const point&) const
// должен быть константным, а p3 в него должна передаваться по константной ссылке. если этого не сделать,
// то вот такой код уже не будет компилироваться:
const point p1;
const point p2;
const point p3 = p2 + p3;
Компилятор "размышляет" примерно так: если в функцию передается агрумент по ссылке, значит он там будет изменяться. Временный объекты не разрешено передавать по ссылке, потому что подумали, раз он временный, то все изменения, которые с ним могут случится в функции никому не достануться. а раз так, то лучше это дело запретить. вот и запретили. при этом не важно, изменяется там реально аргумент или нет. компилятору не всегда может заглянуть в реализацию функции, да он этого и не делает. ему достаточно лишь такого предположения на основании сигнатуры функции.

Короче есть кое-какие детальки, с которыми вам лучше ознакомится в спецлитературе.
- Когда и при каких условиях в с++ возникают временные объекты.
- Про дефолтные конструктор копирования и оператор присваивания и в каких случаях
такие сгенеренные вещи не подходят.
osrcproject
3 / 3 / 0
Регистрация: 01.05.2012
Сообщений: 14
01.05.2012, 19:54  [ТС]     не компилит простой код c++ #5
Начал читать Страуструпа, прочитал первое введение в язык, но про эти временные объекты ничего не было написано или я невнимательно читал или это будет дальше или нужно другую литературу читать?
Спасибо за ваше внимание!

Добавлено через 4 минуты
Просто не понятно почему компилятору не нравится, то что ссылки не константные ему то какое дело до этого? По мне так раз не указал, значит так и надо было, не смотря на то что в данном случае изменяться ссылки и вправду не будут
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
01.05.2012, 19:56     не компилит простой код c++ #6
не скажу про страуструпа. может есть, а может и нет. не помню. я вот где это прочитал:
http://www.rsdn.ru/res/book/cpp/most_effective_cpp.xml
Правило 19. Изучите причины возникновения временных объектов
найдите в онлайне, там пара страничек всего. вот там написано все то, что я тут попытался озвучить. только более нормально
да и вообще вся книга хороша. не зря на форуме в списке литературы по плюсам она присутствует.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.05.2012, 20:00     не компилит простой код c++
Еще ссылки по теме:

C++ wxDev-C++ 7.3.1 не компилит.
С++ Borland не компилит прогу C++
C++ Не компилит код

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

Или воспользуйтесь поиском по форуму:
osrcproject
3 / 3 / 0
Регистрация: 01.05.2012
Сообщений: 14
01.05.2012, 20:00  [ТС]     не компилит простой код c++ #7
Спасибо вам огромное, надеюсь разберусь с этой проблемой рас и навсегда =)
Yandex
Объявления
01.05.2012, 20:00     не компилит простой код c++
Ответ Создать тему
Опции темы

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