Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Ханапов
2 / 2 / 2
Регистрация: 26.01.2013
Сообщений: 59
#1

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

16.03.2014, 00:33. Просмотров 591. Ответов 19
Метки нет (Все метки)

Здравствуйте. Есть класс треугольник(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... Что с ней не так? Подскажите пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2014, 00:33
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перегрузка оператора < (C++):

Перегрузка оператора <<
Господа, у меня когнитивный диссонанс. При компиляции программы вылезает...

Перегрузка оператора +
Здравствуйте! Не могу понять, из-за чего появляется ошибка. Вот программа,...

Перегрузка оператора '='
Не давно стал изучать С++ и дошёл до перегрузок операторов, и с книги написал...

Перегрузка оператора
Есть такой вот код: #include &lt;iostream&gt; using namespace std; template &lt;class...

Перегрузка оператора
Имеется код: #include &lt;iostream&gt; class X { public: int a; int b;...

Перегрузка оператора
Имеется время, например 12:12:12 Перегрузка инкремента Time &amp;Time::operator...

19
kupnu4
26 / 26 / 15
Регистрация: 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;
а в операторе сравнения проблема в том, что нужно в качестве параметра принимать ссылку на объект. ну и тогда вроде все работает.
0
Pro100Tom
69 / 28 / 11
Регистрация: 29.10.2012
Сообщений: 339
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];
0
zss
Модератор
Эксперт С++
6956 / 6518 / 4138
Регистрация: 18.12.2011
Сообщений: 17,205
Завершенные тесты: 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;
}
1
Pro100Tom
69 / 28 / 11
Регистрация: 29.10.2012
Сообщений: 339
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;
}
0
zss
Модератор
Эксперт С++
6956 / 6518 / 4138
Регистрация: 18.12.2011
Сообщений: 17,205
Завершенные тесты: 1
31.08.2014, 19:58 #6
Цитата Сообщение от Pro100Tom Посмотреть сообщение
Значит надо будет писать так?
Да, именно так
0
Pro100Tom
69 / 28 / 11
Регистрация: 29.10.2012
Сообщений: 339
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, почему не создали отдельную тему?
Не посчитал нужным. Было много уже тем о перегрузках. Подумал, что мой вопрос впишется в одну из них. Стоило?
0
zss
Модератор
Эксперт С++
6956 / 6518 / 4138
Регистрация: 18.12.2011
Сообщений: 17,205
Завершенные тесты: 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;
}
0
Pro100Tom
69 / 28 / 11
Регистрация: 29.10.2012
Сообщений: 339
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
0
zss
Модератор
Эксперт С++
6956 / 6518 / 4138
Регистрация: 18.12.2011
Сообщений: 17,205
Завершенные тесты: 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;
  }
};
0
MousePro
49 / 30 / 4
Регистрация: 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-го сообщения
0
Pro100Tom
69 / 28 / 11
Регистрация: 29.10.2012
Сообщений: 339
31.08.2014, 21:10 #12
Цитата Сообщение от zss Посмотреть сообщение
Ну тогда напишите свой класс
Да я б с радостью, да мне потом тот POINT использовать надо.
C++
1
Polygon(bdc, point, 3);
Добавлено через 59 секунд
Я б тогда сразу с Vertex'ом работал. Зачем бы мне приходилось копировать значение в POINT. И cast не помогает, всмысле не работает.
0
zss
Модератор
Эксперт С++
6956 / 6518 / 4138
Регистрация: 18.12.2011
Сообщений: 17,205
Завершенные тесты: 1
31.08.2014, 21:32 #13
У Вас без проблем получится преобразовать Point в POINT
C++
1
2
3
Point pa;
 
POINT PA=(POINT)pa;
0
Pro100Tom
69 / 28 / 11
Регистрация: 29.10.2012
Сообщений: 339
31.08.2014, 21:58 #14
Тогда здорово. Теперь вопрос. Стоит ли так заморачиваться ради "красивого кода" или "это нормально", если оставить код таким, каким я его показала вначале?
0
zss
Модератор
Эксперт С++
6956 / 6518 / 4138
Регистрация: 18.12.2011
Сообщений: 17,205
Завершенные тесты: 1
31.08.2014, 22:09 #15
Дело вкуса!
0
Pro100Tom
69 / 28 / 11
Регистрация: 29.10.2012
Сообщений: 339
31.08.2014, 22:20 #16
Ну и хрен с ним тогда, спасибо большое за помощь!
0
Pro100Tom
69 / 28 / 11
Регистрация: 29.10.2012
Сообщений: 339
03.09.2014, 00:43 #17
Эт снова я! Как создать оператор такого типа: float operator * (const float matrix1[4][4], const float matrix2[4][4])?
0
gray_fox
What a waste!
1552 / 1257 / 165
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
04.09.2014, 00:55 #18
Цитата Сообщение от Pro100Tom Посмотреть сообщение
Эт снова я! Как создать оператор такого типа: float operator * (const float matrix1[4][4], const float matrix2[4][4])?
Нельзя перегрузить операторы для встроенных типов.
0
Pro100Tom
69 / 28 / 11
Регистрация: 29.10.2012
Сообщений: 339
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 /= - нет. Помогите пожалуйста.
0
gray_fox
What a waste!
1552 / 1257 / 165
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 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);
}
1
05.09.2014, 03:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2014, 03:26
Привет! Вот еще темы с решениями:

Перегрузка оператора ()
Привет всем помогите придумать способ реализаци следущей задачи: есть класс...

Перегрузка оператора +
Здравствуйте. Проблема в следующем: у меня есть класс. Список, реализующий...

Перегрузка оператора <
У меня 2 файла . Przedzial.h и Przedzial.cpp В первом только класс и названия...

Перегрузка оператора ~
Добрый вечер. Помогите пожалуйста. Задание:Вектор имеет 3 числа(водить их надо...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru