Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Ханапов
2 / 2 / 1
Регистрация: 26.01.2013
Сообщений: 59
#1

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

16.03.2014, 00:33. Просмотров 541. Ответов 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++):

Перегрузка оператора + - C++
Осуществляю перегрузку оператора +. и вот почему-то член класса s меняет свою длину с 4 до 7 и мне вот это не понятно.. Подскажите,...

Перегрузка оператора = - C++
Ввести строку символов S1. Программа должна содержать перегруженную операцию “=”, использование которой скопирует S1 в S2 при следующих...

Перегрузка оператора [] - C++
Создал класс в котором массив указателей на другой класс, перегрузил оператор взятия индекса следующим образом: h-файл #ifndef...

Перегрузка оператора - - C++
В своём классе я перегрузил оператор -,но в функции,использующей вычитание возникает ошибка error C2678: бинарный &quot;-&quot;: не найден...

Перегрузка оператора += - C++
реализую класс собственных строк называеться MyString вылетает при использовании оператора += самое интересное что если дебажишь код по...

Перегрузка оператора () - C++
кто может подсказать как создать перегрузку что бы можно было работать с амссивввом в таком ввиде mass(3)=2 а не mass=2; если можно...

19
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;
а в операторе сравнения проблема в том, что нужно в качестве параметра принимать ссылку на объект. ну и тогда вроде все работает.
0
Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 331
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
Модератор
Эксперт С++
6578 / 6140 / 2022
Регистрация: 18.12.2011
Сообщений: 15,999
Завершенные тесты: 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 / 7
Регистрация: 29.10.2012
Сообщений: 331
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
Модератор
Эксперт С++
6578 / 6140 / 2022
Регистрация: 18.12.2011
Сообщений: 15,999
Завершенные тесты: 1
31.08.2014, 19:58 #6
Цитата Сообщение от Pro100Tom Посмотреть сообщение
Значит надо будет писать так?
Да, именно так
0
Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 331
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
Модератор
Эксперт С++
6578 / 6140 / 2022
Регистрация: 18.12.2011
Сообщений: 15,999
Завершенные тесты: 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 / 7
Регистрация: 29.10.2012
Сообщений: 331
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
Модератор
Эксперт С++
6578 / 6140 / 2022
Регистрация: 18.12.2011
Сообщений: 15,999
Завершенные тесты: 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 / 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-го сообщения
0
Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 331
31.08.2014, 21:10 #12
Цитата Сообщение от zss Посмотреть сообщение
Ну тогда напишите свой класс
Да я б с радостью, да мне потом тот POINT использовать надо.
C++
1
Polygon(bdc, point, 3);
Добавлено через 59 секунд
Я б тогда сразу с Vertex'ом работал. Зачем бы мне приходилось копировать значение в POINT. И cast не помогает, всмысле не работает.
0
zss
Модератор
Эксперт С++
6578 / 6140 / 2022
Регистрация: 18.12.2011
Сообщений: 15,999
Завершенные тесты: 1
31.08.2014, 21:32 #13
У Вас без проблем получится преобразовать Point в POINT
C++
1
2
3
Point pa;
 
POINT PA=(POINT)pa;
0
Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 331
31.08.2014, 21:58 #14
Тогда здорово. Теперь вопрос. Стоит ли так заморачиваться ради "красивого кода" или "это нормально", если оставить код таким, каким я его показала вначале?
0
zss
Модератор
Эксперт С++
6578 / 6140 / 2022
Регистрация: 18.12.2011
Сообщений: 15,999
Завершенные тесты: 1
31.08.2014, 22:09 #15
Дело вкуса!
0
31.08.2014, 22:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2014, 22:09
Привет! Вот еще темы с ответами:

Перегрузка оператора + - C++
Не могу заставить работать перегруженный оператор + в функции CMoveByVector Point.h: #define POINT_H #include &lt;iostream&gt; ...

Перегрузка оператора << - C++
Есть такой код. class matrix { public: ......; const double* operator(int) const; double* const operator(int); friend...

Перегрузка оператора << - C++
Здравствуйте форумчане, помогите исправить ошибку. Вообщем есть класс с перегруженным оператором &lt;&lt; . Category.h class...

Перегрузка оператора = - C++
Нужно перегрузить оператор так что бы в начале строки и в конце были квадратные скобки . Все почти работает только вот вывод на экран не...


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

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

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