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

Класс Point и Rectangle - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Рекурсивные функции http://www.cyberforum.ru/cpp-beginners/thread989584.html
Плиз, помогите. Ошибку выдает, а исправить как - непонятно... Пока не очень понимаю рекурсивные функции... Составить программу, используя рекурсивную функцию. Массив S содержит 10 символов. Дана строка из 120 символов. Написать программу, включающую рекурсивную функцию, которая удаляет из строки все символы, указанные в массиве S. Строка при этом “сжимается”. За первое внешнее обращение к...
C++ как переделать задачу что б были указатели ? #include <iostream.h> #include <conio.h> #include <math.h> int main () { int a , d, b; cout<<"vvedite elementu matricu"<<endl; for (int i=0; i<6; i++) for (int j=0; j<6; j++) cin>>a ; http://www.cyberforum.ru/cpp-beginners/thread989583.html
Error with multimap C++
Вот код. struct sravn{ bool operator()(const char* s1, const char* s2) const{ return strcmp(s1, s2) < 0; } }; typedef multimap<char*, Student, sravn> MapType; void del_stud(MapType *list){
Очистка памяти через деструктор C++
Здравствуйте ! Надо написать к определенному классу конструктор/деструктор. class building { private: string location_street; unsigned int number_of_building; public : building(): location_street("NULL"),
C++ Реализовать конструктор копирования http://www.cyberforum.ru/cpp-beginners/thread989562.html
Задан класс, содержащий поля int x, y; double a,b,c. Реализовать конструктор копирования, который выполняет копирование всех полей входного объекта в новый экземпляр
C++ Задать описание класса Задать описание класса, содержащего поля int x, y; double a,b,c и позволяет выполнять следующие методы:Выполнять инициализацию всех полей одновременно, и каждого поля отдельно. Добавлено через 23 минуты помогите сделать подробнее

Показать сообщение отдельно
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
27.10.2013, 19:50     Класс Point и Rectangle
Деструкторы вам тут тоже ни к чему -- динамически распределяемой памяти нет.
Про наследование вообще ересь та еще.
Не надо никого наследовать и пихать левые штуки. Можно все сделать очень консистентно с помощью фабричных методов.

Быдыщ:
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
#include <iostream>
#include <iomanip>
#include <list>
 
class Point {
 public:
  Point(double x, double y) : x(x), y(y) {}
  Point() : x(0), y(0) {}
  double getX() const { return x; }
  double getY() const { return y; }
 private:
  double x, y;
};
 
std::ostream &operator<<(std::ostream &stream, const Point &p) {
  return stream << "[" <<
    std::fixed << std::setprecision(2) << p.getX() << ", " <<
    std::fixed << std::setprecision(2) << p.getY() << "]";
}
 
class Figure {
 public:
  const std::list<Point> &getPoints() const {
    return points;
  }
  /**
   * Создает квадрат со сторонами, параллельными осям координат.
   * 
   * @param base левая верхняя точка квадрата
   * @param side длина стороны квадрата
   */
  static Figure createSquare(const Point &base, double side) {
    std::list<Point> points;
    points.push_back(base);
    points.push_back(Point(base.getX() + side, base.getY()));
    points.push_back(Point(base.getX() + side, base.getY() + side));
    points.push_back(Point(base.getX(),base.getY() + side));
    return Figure(points);
  }
 private:
  std::list<Point> points;
  Figure(std::list<Point> &points) {
    this->points = points;
  }
};
 
std::ostream &operator<<(std::ostream &stream, const Figure &p) {
  stream << "Figure{";
  std::list<Point>::const_iterator i = p.getPoints().begin();
  while(i != p.getPoints().end()) {
    stream << *i++;
    if (i != p.getPoints().end()) {
      stream << ", ";
    }
  }
  return stream << "}";
}
 
 
int main(int, char**) {
  Figure square = Figure::createSquare(Point(1, 1), 10);
 
  std::cout << square << std::endl;
 
  return 0;
}
Добавлено через 5 минут
С прямоугольником:

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
#include <cmath>
#include <iostream>
#include <iomanip>
#include <list>
 
class Point {
 public:
  Point(double x, double y) : x(x), y(y) {}
  Point() : x(0), y(0) {}
  double getX() const { return x; }
  double getY() const { return y; }
 private:
  double x, y;
};
 
std::ostream &operator<<(std::ostream &stream, const Point &p) {
  return stream << "[" <<
    std::fixed << std::setprecision(2) << p.getX() << ", " <<
    std::fixed << std::setprecision(2) << p.getY() << "]";
}
 
class Figure {
 public:
  const std::list<Point> &getPoints() const {
    return points;
  }
  /**
   * Создает квадрат со сторонами, параллельными осям координат.
   * 
   * @param base левая верхняя точка квадрата
   * @param side длина стороны квадрата
   */
  static Figure createSquare(const Point &base, double side) {
    std::list<Point> points;
    points.push_back(base);
    points.push_back(Point(base.getX() + side, base.getY()));
    points.push_back(Point(base.getX() + side, base.getY() + side));
    points.push_back(Point(base.getX(),base.getY() + side));
    return Figure(points);
  }
 
  /**
   * Создает прямоугольник со сторонами, параллельными осям координат.
   * 
   * @param base левая верхняя точка квадрата
   * @param sideX ширина прямоугольника
   * @param sideY высота прямоугольника
   */
  static Figure createRectangle(const Point &base, double sideX, 
    double sideY) {
    std::list<Point> points;
    points.push_back(base);
    points.push_back(Point(base.getX() + sideX, base.getY()));
    points.push_back(Point(base.getX() + sideX, base.getY() + sideY));
    points.push_back(Point(base.getX(),base.getY() + sideY));    
    return Figure(points);
  }
 private:
  std::list<Point> points;
  Figure(std::list<Point> &points) {
    this->points = points;
  }
};
 
std::ostream &operator<<(std::ostream &stream, const Figure &p) {
  stream << "Figure{";
  std::list<Point>::const_iterator i = p.getPoints().begin();
  while(i != p.getPoints().end()) {
    stream << *i++;
    if (i != p.getPoints().end()) {
      stream << ", ";
    }
  }
  return stream << "}";
}
 
 
int main(int, char**) {
  Figure square = Figure::createSquare(Point(0, 0), 8);
  Figure rectangle = Figure::createRectangle(Point(1, 1), 10, 15);
 
  std::cout << square << std::endl << rectangle << std::endl;
 
  return 0;
}
Преимущество подхода в том, что нельзя создать заведомо неконстистентный прямоугольник -- когда точки не образуют прямоугольник.
 
Текущее время: 16:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru