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

Перегрузка оператора < - C++

Восстановить пароль Регистрация
 
Ханапов
2 / 2 / 1
Регистрация: 26.01.2013
Сообщений: 59
16.03.2014, 00:33     Перегрузка оператора < #1
Здравствуйте. Есть класс треугольник(Triangle), надо перегрузить оператор < для объектов класса Triangle. Написал код, вроде ошибок нет, но среда отказывается компилировать. Доже при попытке вызвать элементарный метод Show класса Point вылезает ошибка-"Point::Show: в вызове функции отсутствует список аргументов; используйте "&Point::Show" для создания указателя на член". Во мой код:



Кликните здесь для просмотра всего текста
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
// ConsoleApplication5.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "iostream"
#include <cstring>
using namespace std;
 
class Point
{
public:
    Point(): x(0),y(0){};
    Point(double _x, double _y):x(_x), y(_y){};
    void Show() const;
public:
    double x,y;
};
 
void Point::Show() const {
    cout << " (" << x << "," << y << ")";
}
 
class Triangle
{
public:
    Triangle(Point,Point,Point, const char*);
    Triangle(const char*);
    ~Triangle();
    Point Get_v1() const {return v1;}
    Point Get_v2() const {return v2;}
    Point Get_v3() const {return v3;}
    char* GetName() const {return name;}
    void ShowBase() const;
    void ShowSideAndArea() const;
    bool operator<(Triangle) const;
public:
    static int count;
private:
    char* оbjID;
    char* name;
    Point v1,v2,v3;
    double a,b,c,Square,halfPer;
};
 
//int Triangle::count=0;
 
Triangle::Triangle(Point _v1,Point _v2,Point _v3,const char* ident): v1(_v1), v2(_v2), v3(_v3)
{
    char buf[16];
    оbjID = new char[strlen(ident)+1];
    strcpy(оbjID,ident);
    count++;
    cin >> buf;
    name = new char[strlen(buf)+1];
    strcpy(name,buf);
    a = sqrt(pow((v1.x-v2.x),2)+pow((v1.y-v2.y),2));
    b = sqrt(pow((v2.x-v3.x),2)+pow((v2.y-v3.y),2));
    a = sqrt(pow((v1.x-v3.x),2)+pow((v1.y-v3.y),2));
    halfPer=(a+b+c)/2;
    Square = ceil(sqrt(halfPer*(a-halfPer)*(b-halfPer)*(c-halfPer))*100)/100;
    cout << "Constructor 1 for " << оbjID << "(" << name << ")" << endl;
}
 
 
Triangle::Triangle(const char* ident)
{
    char buf[16];
    оbjID = new char[strlen(ident)+1];
    strcpy(оbjID,ident);
    count++;
    cin >> buf;
    name = new char[strlen(buf)+1];
    strcpy(name,buf);
    a=b=c=0;
    cout << "Constructor 2 for " << оbjID << "(" << name << ")" << endl;
}
 
 
 
Triangle::~Triangle()
{
    cout << "Destructor for " << оbjID << "(" << name << ")" << endl;
    delete [] оbjID;
    delete [] name;
}
 
bool Triangle::operator<(Triangle tr) const
{
    return(Square < tr.Square) ? true : false;
}
 
int Triangle::count=0;
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    Point A(0,0);
    Point B(0,10);
    Point C(10,0);
    //A.Show; cout << endl;
    //B.Show; cout << endl;
    //C.Show; cout << endl;
    /*Triangle ABC(A,B,C, "First");
    Point A1(0,0);
    Point B1(0,5);
    Point C1(5,0);
    Triangle ABC1(A1,B1,C1, "Second");
    cout << (ABC <ABC1);*/
    system("pause");
    return 0;
}


Вот ошибка-error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. strcopy... Что с ней не так? Подскажите пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2014, 00:33     Перегрузка оператора <
Посмотрите здесь:

C++ Перегрузка оператора ()
C++ Перегрузка оператора []
C++ Перегрузка оператора ->
Перегрузка оператора *= C++
C++ Перегрузка оператора <<
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kupnu4
26 / 26 / 9
Регистрация: 03.05.2013
Сообщений: 71
16.03.2014, 01:49     Перегрузка оператора < #2
вообще, для вызова метода Show следовало бы писать A.Show() это решает вашу проблему, но тогда деструктор начинает творить чудеса))

Добавлено через 42 минуты
по-мимо всего прочего у тебя в конструкторе опечатка (вместо "с" еще раз вычисляется сторона "а"). плюс к этому площадь треуголника через полупериметр вычисляется не так. Правильно будет из полупериметра вычитать сторону, и тогда вид будет:
C++
1
Square = ceil(sqrt(halfPer*(halfPer-a)*(halfPer-b)*(halfPer-c))*100)/100;
а в операторе сравнения проблема в том, что нужно в качестве параметра принимать ссылку на объект. ну и тогда вроде все работает.
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
31.08.2014, 18:19     Перегрузка оператора < #3
Помогите и мне пожалуйста.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
POINT point[3];
            Face vertexFace;
 
            for (int i = 0; i < model->vertexFaces.size(); i++)
            {
                vertexFace = model->vertexFaces[i];
 
                point[0].x = (int)model->transformedVertices[vertexFace.a - 1].x;
                point[0].y = (int)model->transformedVertices[vertexFace.a - 1].y;
 
                point[1].x = (int)model->transformedVertices[vertexFace.b - 1].x;
                point[1].y = (int)model->transformedVertices[vertexFace.b - 1].y;
 
                point[2].x = (int)model->transformedVertices[vertexFace.c - 1].x;
                point[2].y = (int)model->transformedVertices[vertexFace.c - 1].y;
 
                Polygon(bdc, point, 3);
            }
Как создать оператор, чтобы можно было бы сделать вот так:
C++
1
2
3
point[0] = (int)model->transformedVertices[vertexFace.a - 1];
                point[1] = (int)model->transformedVertices[vertexFace.b - 1];
                point[2] = (int)model->transformedVertices[vertexFace.c - 1];
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,178
Завершенные тесты: 1
31.08.2014, 19:40     Перегрузка оператора < #4
Pro100Tom, почему не создали отдельную тему?
Для такого присвоения ( point[0] = model->transformedVertices[vertexFace.a - 1]; ) в класс POINT надо добавить метод
(предполагаю, что transformedVertices[vertexFace.a - 1] имеет тоже тип POINT):
C++
1
2
3
4
5
POINT& operator=(const POINTt& pp)
{
   x=pp.x;y=pp.y;
   return *this;
}
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
31.08.2014, 19:56     Перегрузка оператора < #5
Цитата Сообщение от zss Посмотреть сообщение
предполагаю, что transformedVertices[vertexFace.a - 1] имеет тоже тип POINT)
Нет, он имеет тип Vertex. Vertex - это структура.
C++
1
2
3
4
5
6
7
8
9
10
struct Vertex
{
    float x, y, z;
    Vertex(float x = 0.0f, float y = 0.0f, float z = 0.0f)
    {
        this->x = x;
        this->y = y;
        this->z = z;
    }
};
Значит надо будет писать так?
C++
1
2
3
4
5
POINT& operator=(const Vertex& pp)
{
   x=pp.x;y=pp.y;
   return *this;
}
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,178
Завершенные тесты: 1
31.08.2014, 19:58     Перегрузка оператора < #6
Цитата Сообщение от Pro100Tom Посмотреть сообщение
Значит надо будет писать так?
Да, именно так
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
31.08.2014, 20:02     Перегрузка оператора < #7
И я не очень понимаю куда надо записывать этот код. Тот кусок кода, который я прислал сначала находится в main.cpp. Тип POINT - это вообще из библиотеки.
C++
1
#include <windows.h>
Model - это instance класса Model.cpp/Model.h, там и находится эта структура Vertex, но отдельно, не внутри самого класса (если это вообще возможно). И использую заголовочный файл model.h в своём main.cpp.

Добавлено через 2 минуты
Цитата Сообщение от zss Посмотреть сообщение
Pro100Tom, почему не создали отдельную тему?
Не посчитал нужным. Было много уже тем о перегрузках. Подумал, что мой вопрос впишется в одну из них. Стоило?
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,178
Завершенные тесты: 1
31.08.2014, 20:11     Перегрузка оператора < #8
Если нет доступа к POINT, то попробуйте тогда глобальную функцию
C++
1
2
3
4
5
POINT& operator=(POINT& p1,const Vertex& pp)
{
   p1.x=pp.x;p1.y=pp.y;
   return p1;
}
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
31.08.2014, 20:26     Перегрузка оператора < #9
Код
	2	IntelliSense: 'operator=' must be a member function	c:\Users\Tomas\Documents\Visual Studio 2013\Projects\3D Renderer\3D Renderer\Main.cpp	86
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,178
Завершенные тесты: 1
31.08.2014, 20:42     Перегрузка оператора < #10
Ну тогда напишите свой класс
C++
1
2
3
4
5
6
7
8
9
struct Point
{
   double x,y;
   Point& operator=(const Vertex& pp)
  {
      x=pp.x;y=pp.y;
      return *this;
  }
};
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
31.08.2014, 20:54     Перегрузка оператора < #11
попробуй strcpy_s (если проблема только с strcpy)
C++
1
2
3
4
5
6
7
8
    test(char* a)
    {
      char * name;
        int len = strlen(a) + 1;
        name = new char[len];
        strcpy_s(name, len, a);
 
    }
Добавлено через 7 минут
//del, не посмотрел время 1-го сообщения
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
31.08.2014, 21:10     Перегрузка оператора < #12
Цитата Сообщение от zss Посмотреть сообщение
Ну тогда напишите свой класс
Да я б с радостью, да мне потом тот POINT использовать надо.
C++
1
Polygon(bdc, point, 3);
Добавлено через 59 секунд
Я б тогда сразу с Vertex'ом работал. Зачем бы мне приходилось копировать значение в POINT. И cast не помогает, всмысле не работает.
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,178
Завершенные тесты: 1
31.08.2014, 21:32     Перегрузка оператора < #13
У Вас без проблем получится преобразовать Point в POINT
C++
1
2
3
Point pa;
 
POINT PA=(POINT)pa;
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
31.08.2014, 21:58     Перегрузка оператора < #14
Тогда здорово. Теперь вопрос. Стоит ли так заморачиваться ради "красивого кода" или "это нормально", если оставить код таким, каким я его показала вначале?
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,178
Завершенные тесты: 1
31.08.2014, 22:09     Перегрузка оператора < #15
Дело вкуса!
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
31.08.2014, 22:20     Перегрузка оператора < #16
Ну и хрен с ним тогда, спасибо большое за помощь!
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
03.09.2014, 00:43     Перегрузка оператора < #17
Эт снова я! Как создать оператор такого типа: float operator * (const float matrix1[4][4], const float matrix2[4][4])?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
04.09.2014, 00:55     Перегрузка оператора < #18
Цитата Сообщение от Pro100Tom Посмотреть сообщение
Эт снова я! Как создать оператор такого типа: float operator * (const float matrix1[4][4], const float matrix2[4][4])?
Нельзя перегрузить операторы для встроенных типов.
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
05.09.2014, 03:13     Перегрузка оператора < #19
Спасибо. А как реализовать такой оператор?
C++
1
friend const Vertex operator /= (const float& b);
Пишет
Код
IntelliSense: too few parameters for this operator function
Если пишу так:
C++
1
friend const Vertex operator /= (const Vertex& a, const float& b);
То как бы ошибки нет, но само действие не работает. Вызывается почему-то деструктор и нифига не делится.
C++
1
a = a / 2
работает, а вот c /= - нет. Помогите пожалуйста.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2014, 03:26     Перегрузка оператора <
Еще ссылки по теме:

C++ Перегрузка оператора +
C++ Перегрузка оператора <<
C++ Перегрузка оператора []

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
05.09.2014, 03:26     Перегрузка оператора < #20
Цитата Сообщение от Pro100Tom Посмотреть сообщение
C++
1
friend const Vertex operator /= (const Vertex& a, const float& b);
Ну этот оператор (с присвоением) должен менять левый операнд, значит соответствующий параметр (первый) должен быть ссылкой; так же возвращать стоит ссылку на него (что бы работало как со встроенными типами, но это не обязательно).
C++
1
2
3
4
friend Vertex& operator /=(Vertex& a, const float& b) {
   // ...
   return a;
}
Можно и виде метода класса:
C++
1
2
3
4
Vertex & operator /=(float const b) {
   // ...
   return *this;
}
Добавлено через 4 минуты
Кстати потом operator / это просто
C++
1
2
3
Vertex operator /(Vertex a, float const b) {
   return (a /= b);
}
Yandex
Объявления
05.09.2014, 03:26     Перегрузка оператора <
Ответ Создать тему
Опции темы

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