Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2013, 16:29   #41
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Посмотрите внимательно на этот код. Он понятен?

Код:
#include <iostream>
#include <cmath>
using namespace std;

class Circle {
public:
    Circle(int r = 0) : radius(r) {
    }
    
    double setRadius(double r) {
        radius = r;
    }

    double getRadius() {
        return radius;
    }
    
private:
    double radius;
};

int main() {
    Circle a_circle;
    a_circle.setRadius(25);
    cout << a_circle.getRadius() << endl;

    Circle b_circle;
    b_circle.setRadius(15);
    cout << b_circle.getRadius() << endl;

    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 29.09.2013, 16:32   #42
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию

8Observer8,да
fkty вне форума Ответить с цитированием
Старый 29.09.2013, 16:35   #43
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Теперь я в коде выше хочу, чтобы функция принимала переменную с таким же именем, что и внутренняя (приватная)

Код:
    double setRadius(double radius) {
        radius = radius;
    }
Но это не сработает. Как-то нужно обозначить, что слева от знака равно это именно внутренняя переменная класса. Вот для этого я и написал this.

Код:
    double setRadius(double radius) {
        this->radius = radius;
    }
this это указатель на сам объект класса.

Код:
#include <iostream>
#include <cmath>
using namespace std;

class Circle {
public:
    Circle(int r = 0) : radius(r) {
    }
    
    double setRadius(double radius) {
        this->radius = radius;
    }

    double getRadius() {
        return radius;
    }
    
private:
    double radius;
};

int main() {
    Circle a_circle;
    a_circle.setRadius(25);
    cout << a_circle.getRadius() << endl;

    Circle b_circle;
    b_circle.setRadius(15);
    cout << b_circle.getRadius() << endl;

    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 29.09.2013, 16:41   #44
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Если с this понятно, то давайте следующую строку.
8Observer8 вне форума Ответить с цитированием
Старый 29.09.2013, 18:55   #45
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию

bool operator<(const Circle &rhs) const { return this->area < rhs.getArea(); }
fkty вне форума Ответить с цитированием
Старый 29.09.2013, 19:35   #46
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Для сортировки нужен реализованный оператор "меньше", который сравнивает объекты класса. Сам оператор получает 2 объекта (неявный this и один явный через аргумент) и возвращает bool результат сравнения. Поскольку сравниваем по площади, то и возвращаем сравнение полей area у 2 объектов. Можно не писать getArea (доступ к полю у метода и так есть) - return this->area < rhs.area;.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 29.09.2013, 20:46   #47
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

BDA правильно всё написал. Нам теперь лишь нужно "поиграться" с операторами.

И так, начнём немного из далека. Допустим перед нами стоит задача складывать объекты класса "Окружность". Будем складывать не площади, а радиусы (для Вас будем потом задание сделать сложение, но не по радиусам, а по площадям)

Вообще нужно (при решении задачи на C++) всегда стараться в главной функции (в main) держать, как можно меньше кода. Весь код нужно помещать в функции класса или в свободные функции (вне классов).

Сложение объектов должно в итоге выглядеть так:

- создали объекты класса Circle
- установили им радиус
- сложили объекты (с = a + b)

main.cpp
Код:
int main() {
    Circle a;
    a.setRadius(5);

    Circle b;
    b.setRadius(15);

    Circle c;

    c = a + b;

    cout << c.getRadius() << endl;
    
    return 0;
}
Вот для этой записи:
Код:
c = a + b;
нужно переопределить оператор сложения.

"oparator+"() - всё, что в двойных кавычках - это название функции.

Определяется она вот так:

Код:
Circle operator+(const Circle &rhs) {
        Circle c;
        c.setRadius(this->radius + rhs.radius);
        return c;
    }
А вызывается одним из следующих способов:

Первый способ ( редко используемый )
Код:
c = a.operator+(b);
Второй способ ( сокращённый способ вызова функции oparator+() ):
Код:
c = a + b;
Вот как это выглядит:

Код:
#include <iostream>
#include <cmath>
using namespace std;

class Circle {
public:

    Circle(int r = 0) : radius(r) {
    }

    double setRadius(double radius) {
        this->radius = radius;
    }

    double getRadius() {
        return radius;
    }
    
    Circle operator+(const Circle &rhs) {
        Circle c;
        c.setRadius(this->radius + rhs.radius);
        return c;
    }

private:
    double radius;
};

int main() {
    Circle a;
    a.setRadius(5);

    Circle b;
    b.setRadius(15);

    Circle c;

    c = a + b;

    cout << c.getRadius() << endl;
    
    return 0;
}
По этому коду есть затруднения? Сможете реализовать сложение не по радиусам, как здесь, а по площадям? Попробуйте. Это будет очень полезно.
8Observer8 вне форума Ответить с цитированием
Старый 30.09.2013, 11:11   #48
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Ещё такая мысль есть, что вместо массива нужно в С++ использовать vector. Он очень удобен. Можно узнать его размер array.size() (вернёт количество элементов в нём). Он динамически расширяем, то есть мы в процессе работы программы может неограниченное число элементов в него впихнуть array.push_back(1.64); В объекте класса vector мы может хранить не только int, double, и т.д. но так же и объекты нашего класса Circle (об этом позже, сейчас посмотрите пример ниже, где мы в объект класса vector пихаем double-числа)

Класс vector подключается с помощью директирвы: #include <vector>

Код:
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<double> array;
    
    array.push_back(3.14);
    array.push_back(5.16);
    array.push_back(6.35);
    array.push_back(1.64);
    
    for (int i = 0; i < array.size(); i++) {
        cout << array[i] << endl;
    }
    
    return 0;
}

Последний раз редактировалось 8Observer8; 30.09.2013 в 11:15.
8Observer8 вне форума Ответить с цитированием
Старый 06.10.2013, 19:17   #49
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию

8Observer8,давно не заходила на форум....а что же такое &rhs,этого же нет нигде?
fkty вне форума Ответить с цитированием
Старый 06.10.2013, 19:23   #50
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Это ссылка. Я сейчас пример небольшой напишу, чтобы наглядно было.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание и уничтожение объектов. Время жизни объектов C++/C# Anett// Помощь студентам 0 24.10.2011 23:26
Движение объектов используя классы ryashya Паскаль, Turbo Pascal, PascalABC.NET 0 29.09.2011 00:07
Классы, объекты,поля объектов Mr_skiner Общие вопросы Delphi 9 10.03.2011 23:07
Чем отличаются классы от объектов в Delphi? JY_ Помощь студентам 1 25.01.2009 18:57