Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для nobless1368
14 / 14 / 2
Регистрация: 04.06.2012
Сообщений: 124
Записей в блоге: 1

Проверка перегруженности оператора

22.03.2015, 11:18. Показов 2103. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возник такой вопрос: как проверить, работает "дефолтный" оператор или перегруженный. Есть подозрения, что сделал что-то не правильно при перегрузке, а понять, что именно не знаю как, т.к. дебаггер не показывает какая версия оператора используется. Попробовал добавить вывод строки в теле перегруженного оператора - не выводится. Есть следующий код:

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
23
24
25
26
27
#ifndef POINT
#define POINT
 
#include <string>
#include <iostream>
 
using std::string;
using std::ostream;
 
class Point {
public:
    float x, y;
    string name;
 
    bool operator <(Point&); // { return value < a.value; }
    bool operator >(Point&);    
    friend ostream& operator <<(ostream& os, Point p);
 
    void setAnotherPoint(float x, float y);
    void setAnotherPoint(float x, float y, string name);
 
    Point(float x, float y);
    Point(float x, float y, string name);
    ~Point();
};
 
#endif // !POINT
Point.cpp
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
#include "Point.h"
 
Point::Point(float x, float y) {
    this->x = x;
    this->y = y;
}
 
Point::Point(float x, float y, string name) {
    this->x = x;
    this->y = y;
    this->name = name;
}
 
Point::~Point() {
    //std::cout << std::endl << "Hi! I'm destructor of the class Point. I'm doing nothing except this output because the creator had used a library type for ANSI string" << std::endl;
}
 
bool Point::operator <(Point& a) {  
        std::cout << "YEP";
    return ((this->x + this->y) < (x + y));
}
 
bool Point::operator >(Point& a) {
    return ((this->x + this->y) > (a.x + a.y));
}
 
ostream& operator <<(ostream& os, Point p) {
    os << p.name << " (" << p.x << ", " << p.y << ")";
    return os;
}
 
void Point::setAnotherPoint(float x, float y) {
    this->x = x;
    this->y = y;
}
 
void Point::setAnotherPoint(float x, float y, string name) {
    this->x = x;
    this->y = y;
    this->name = name;
}
Test.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "Point.h"
 
int main() {
    string pName = "p";
    string p1Name = "p1";
    Point* p = new Point(2, 2, pName);
    Point* p1 = new Point(1, 2, p1Name);
 
    std::cout << "P>P1: " << (p > p1) << std::endl;
    std::cout << "P<P1: " << (p < p1) << std::endl;
    std::cout << *p;
    system("pause");
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.03.2015, 11:18
Ответы с готовыми решениями:

Проверка оператора присваивания
Программа должна находить и проверять правильность написания операторов присваивания в исходном тексте программы. Результатом работы...

Избыточное копирование объекта при реализации оператора умножения и оператора присваивания
Есть класс работы с матрицами. Есть операция умножения матриц, описанная как оператор класса. В данном коротком примере я просто моделирую...

Неправильная работа оператора присваивания после работы оператора суммирования
Доброго времени суток. У меня есть класс вектор class TVector {//ewde public: TVector(); //Vector(Vector &amp;v); ...

8
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
22.03.2015, 11:24
В Point.cpp используешь string (в 8 строке кода), но нету ни инклуда, ни пространства имён. Там же и объект cout (в 19 строке кода), тоже без инклуда.
То же самое в Test.cpp - используешь объект cout, а include <iostream> нет, используешь system("pause"), а include <windows.h> нет.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.03.2015, 11:36
Цитата Сообщение от gru74ik Посмотреть сообщение
используешь system("pause"), а include <windows.h> нет.
C++
1
#include <cstdlib>
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
22.03.2015, 11:37
Croessmah, перепутал, сорри.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.03.2015, 11:37
Цитата Сообщение от gru74ik Посмотреть сообщение
То же самое в Test.cpp - используешь объект cout, а include <iostream> нет
C++
1
2
//в этом заголовке есть и string и iostream
#include "Point.h"
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
22.03.2015, 11:59
Croessmah, а ну да, там инклуд в инклуде. Хмм...

Добавлено через 2 минуты
В любом случае, пространство имён забыл для string в 8 строке кода в Point.cpp и в Test.cpp забыл #include <cstdlib>

Добавлено через 14 минут
Тьфу, с этими инклудами в инклудах... Вопрос снимается. Актуально только #include <cstdlib> в мэйне, похоже.

Добавлено через 3 минуты
А если экземпляр класса будет конструироваться при помощи первого конструктора, то чему будет равен член name? Ему бы тогда какое-то значение по умолчанию задать, что ли...
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
22.03.2015, 12:11
Лучший ответ Сообщение было отмечено nobless1368 как решение

Решение

Цитата Сообщение от nobless1368 Посмотреть сообщение
C++
1
2
3
4
Point* p = new Point(2, 2, pName);
* * Point* p1 = new Point(1, 2, p1Name);
std::cout << "P>P1: " << (p > p1) << std::endl;
* * std::cout << "P<P1: " << (p < p1) << std::endl;
Сравниваются указатели, а не сами объекты.
2
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
22.03.2015, 12:28
Лучший ответ Сообщение было отмечено nobless1368 как решение

Решение

Цитата Сообщение от nobless1368 Посмотреть сообщение
как проверить, работает "дефолтный" оператор или перегруженный
При сравнении экземляров класса по-любому работает перегруженный тобой оператор, дефолтный ничего не знает о твоём классе. Ведь для того ты и перегружал операторы, чтобы обучить их работать с твоим классом.

Немного поправил:

main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "Point.h"
#include <cstdlib>
 
int main()
{
    std::string p1Name = "p1";
    Point* p = new Point(2, 2);
    Point* p1 = new Point(1, 2, p1Name);
 
    std::cout << "P>P1: " << (*p > *p1) << std::endl;
    std::cout << "P<P1: " << (*p < *p1) << std::endl;
    std::cout << *p << std::endl;
    system("pause");
    return 0;
}


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
23
24
25
#ifndef POINT
#define POINT
 
#include <iostream>
#include <string>
 
class Point
{
    private:
        float x, y;
        std::string name = "default_name";
    public:
        bool operator <(Point&); // { return value < a.value; }
        bool operator >(Point&);
        friend std::ostream& operator <<(std::ostream& os, Point p);
 
        void setAnotherPoint(float x, float y);
        void setAnotherPoint(float x, float y, std::string name);
 
        Point(float x, float y);
        Point(float x, float y, std::string name);
        ~Point();
};
 
#endif // !POINT


Point.cpp
Кликните здесь для просмотра всего текста
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 "Point.h"
 
Point::Point(float x, float y)
{
    this->x = x;
    this->y = y;
}
 
Point::Point(float x, float y, std::string name)
{
    this->x = x;
    this->y = y;
    this->name = name;
}
 
Point::~Point()
{
    //std::cout << std::endl << "Hi! I'm destructor of the class Point. "
    //"I'm doing nothing except this output because the creator had used "
    //"a library type for ANSI string" << std::endl;
}
 
bool Point::operator<(Point& a)
{
    std::cout << "YEP ";
    return ((this->x + this->y) < (x + y));
}
 
bool Point::operator>(Point& a)
{
    return ((this->x + this->y) > (a.x + a.y));
}
 
std::ostream& operator<<(std::ostream& os, Point p)
{
    os << p.name << " (" << p.x << ", " << p.y << ")";
    return os;
}
 
void Point::setAnotherPoint(float x, float y)
{
    this->x = x;
    this->y = y;
}
 
void Point::setAnotherPoint(float x, float y, std::string name)
{
    this->x = x;
    this->y = y;
    this->name = name;
}

"YEP " исправно выводится.

Добавлено через 2 минуты
А вот при сравнении самих указателей (а не экземпляров класса) используются дефолтные операторы.
0x10, прав, надо при сравнении было указатели разыменовать.
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
22.03.2015, 12:32
+ где есть смысл, параметры в функцию нужно передавать по константным ссылкам. В данном случае где-то передаются неконстантные ссылки, где-то значения.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.03.2015, 12:32
Помогаю со студенческими работами здесь

Придумайте простую программу с использованием условного оператора IF и оператора switch
Пожалуйста, придумайте простую программу с использованием: условного оператора IF и оператора switch . Эти программы должны быть...

Вызов прегруженного оператора вывода в поток из аналогичного оператора
Программирую в c9.io с g++ получается тоже самое. Элементами стека(pointList) являются стеки(list) для которых уже определен оператор...

Сравнить два целых числа, не используя условного оператора, оператора выбора и так же символов сравнения
Добрый день уважаемые программисты, хотелось, чтобы вы помогли мне в решении одной задачи, а именно подсказали идею решения. Задача...

Сочетания оператора цикла и условного оператора
вывести на экран все числа a от до b , кратные некоторому числу c

сочетания оператора цикла и условного оператора
Известна оценка каждого ученика по физике, посчитать сколько пятерок, количество человек в классе, четверок, трояк, и двоек..


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru