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

Классы - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Найти ошибку в данном примере http://www.cyberforum.ru/cpp-beginners/thread169449.html
#include <math.h> #include <iostream> using namespace std; int main() { int n, a; cin >> n; int sum = 1/a; for (int i=1; i<=n; i++) {
C++ Преобразование одномерного массива, состоящего с n вещественных элементов Помогите пожалуйста! Надо преобразовать одномерный массив, состоящий с n вещественных элементов, таким образом, чтобы сначала располагались все элементы, равные нулю, а потом - все остальные. ... http://www.cyberforum.ru/cpp-beginners/thread169432.html
Вычислительные методы метод ньютона интерполяция вперед C++
Народ кто делал этот метод помогите плз вот теория http://miest.narod.ru/iissvit/rass/vip16.htm.
C++ Классы Вектора.
народ помогите Задание такое: Создать класс vector3D, задаваемый тройкой координат. Обязательно должны быть реализованы: сложение и вычитание векторов, скалярное произведение векторов, умножение...
C++ Получить число вставкой нулей http://www.cyberforum.ru/cpp-beginners/thread169423.html
Разработать программу для реализации указанных действий над целыми числами без знака (unsigned long). Создать два варианта: для чисел, заданных в десятичной и восьмеричной системе счисления: Из...
C++ Реализовать таблицу студентов, предметов и соответствующих оценок с помощью классов задача реализовать классом таблицу студентов предметов и соответствующих оценок.. написать ф-ии, высчитывающие преобладающий балл по каждому предмету,поиск предмета по которому большее количество... подробнее

Показать сообщение отдельно
CyBOSSeR
Эксперт C++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
26.09.2010, 16:25

Не по теме:

Lavroff, что ж ты так над бедным robert19'ом издеваешься


robert19, давай рссмотрим на примере. Нужно создать класс, объекты которого представляют прямоугольники в двумерном пространстве, грани которых параллельны осям координат.
Для начала выберем название класса, наиболее отражающее сущность которую он представляет и сделаем небольшую заготовку:
C++
1
2
class Rectangle {
};
Далее нужно решить какие данные нужно хранить, для того чтобы однозначно представить прямоугольник. Наиболее простой и правильный вариант - хранить координаты верхнего левого и нижнего правого углов прямоугольник. Для хранения координат создадим структуру, представляющую точку в двумерном пространстве, т.е. хранящую две координаты - x и y.
C++
1
2
3
4
struct Point {
  double x;
  double y;
};
Заведем в нашем классе два поля типа Point для хранение углов прямоугольника.
C++
1
2
3
4
5
class Rectangle {
private:
  Point topLeft;
  Point bottomRight;
};
private - это спецификатор доступа. Что такое спецификаторы доступа и с чем их едят - см. в литературе (напомню Павловская идет лесом). Скажу лишь что к секции private имеют доступ только экземпляры того класса, в котором данная секция была объявлена. Зачем помещать данные именно в эту секцию? Да для того, чтобы никто из вне класса никак не смог их попортить.
Перед нами встает вопрос, а как собственно установить значения углов прямоугольника извне класса? Очень просто - завести соответсвующие методы или функции-члены для установки данных значений, не забыв поместить из в секцию public:
C++
1
2
3
4
5
6
7
8
9
10
11
class Rectangle {
public:
  void setTopLeft(const Point& pt) {
    topLeft = pt;
  }
  
  void setBottomRight(const Point& pt) {
    bottomRight = pt;
  }
// ...
};
Что такое const читаем в литературе (Павловская сидит и молчит в трапочку).
Теперь мы уже можен написать подобный код:
C++
1
2
3
4
5
6
7
Point tl = { 1.0, 1.0 };
Point br = { 2.0, 2.0 };
 
Rectangle r;
 
r.setTopLeft(tl);
r.setBottomRight(br);
Как то получается не очень красиво, что мы тратим аж две лишних строки, для инициализация прямоугольника нужными нам значениями его углов. Хотель бы сократить эту запись. Для того чтобы инициализировать объект класса нужным образом есть конструкторы - курим книги (Павловскую не раскуриваем):
C++
1
2
3
4
5
6
7
8
class Rectangle {
public:
  Rectangle(const Point& tl, const Point& br) {
    topLeft = tl;
    bottomRight = br;
  }
  // ...
};
Теперь записать можно так:
C++
1
2
3
4
Point tl = { 1.0, 1.0 };
Point br = { 2.0, 2.0 };
 
Rectangle r(tl, br);  // Вот здесь будет вызван конструктор
Проблему с установкой решили, но ведь нужно как то получать значения углов прямоугольника, инача на кой он нам сдался. Заведем методы получения нужных нам данных:
C++
1
2
3
4
5
6
7
8
9
10
class Rectangle {
public:
  const Point getTopLeft() const {
    return topLeft;
  }
 
  const Point getBottomRight() const {
    return bottomRight;
  }
};
Теперь мы можем получать значения углов:
C++
1
2
3
// ...
Point pt1 = r.getTopLeft();
Point pt2 = r.getBottomRight();
Сами методы получение и установки углов треугольника мало чего дают, мы с такими же темпами могли и структурами обойтись. Нужно добвать к классу какого либо полезного поведения, например, вычисления ширины и высоты прямоугольника:
C++
1
2
3
4
5
6
7
8
9
10
11
class Rectangle {
public:
  // ...
  const double Width() const {
    return bottomRight.x - topLeft.x;
  }
 
  const double Height() const {
    return topLeft.y - bottomRight.y;
  }
};
Теперь соберем все вместе:
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
struct Point {
  double x;
  double y;
};
 
class Rectangle {
public:
  Rectangle(const Point& tl, const Point& br) {
    topLeft = tl;
    bottomRight = br;
  }
 
  void setTopLeft(const Point& pt) {
    topLeft = pt;
  }
  
  void setBottomRight(const Point& pt) {
    bottomRight = pt;
  }
 
  const Point getTopLeft() const {
    return topLeft;
  }
 
  const Point getBottomRight() const {
    return bottomRight;
  }
 
  const double Width() const {
    return bottomRight.x - topLeft.x;
  }
 
  const double Height() const {
    return topLeft.y - bottomRight.y;
  }
 
private:
  Point topLeft;
  Point bottomRight;
};
С использованием, думаю, разберетесь.
5
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru