Страница 1 из 7

Помогите Исправить Ошибки в Программе

Добавлено: 26 сен 2009, 21:40
Luxian
Задание Такое
5) Объявите основной класс с именем точка. Объявите функцию show(), которая выводит координаты точки. Объявите второстепенный класс пентагон с следующими данными:
- функция show(), которая рисует пентагон.


есть ошибки помогите пожалуйста их исправить!

Код: Выделить всё

#include<iostream.h>
#include<graphics.h>

class Point()
{ 
int x;
int y;
public Point(int _x, int _y)
{
x=_x;
y=_y;

}
public Show()
{
//показать x и y
}
}

class Polygon()
{
Point x;
Point y;
Point w;
Point h;
public Plygon(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
{
x.x = x1;
x.y = y1;
y.x = x2;
y.y = y2;
w.x = x3;
w.y = y3;
h.x = x4;
h.y = y4;
}
public Show()
{
x.Show();
y.Show();
w.Show();
h.Show();
}
}

Re: Помогите Исправить Ошибки в Программе

Добавлено: 27 сен 2009, 10:54
MiReQ

Код: Выделить всё

//---------------------------------------------------------------------------

#include "graphics.h"
#include "iostream.h"
#include "conio.h"

//---------------------------------------------------------------------------
class Point
{
friend Polygon;
protected:
 int x;
 int y;
public:
 Point(int _x, int _y)
 {
  x=_x;
  y=_y;
 };
void Show()
 {
  putpixel(x,y,15);
 };
};

class Polygon
{
protected:
 Point *x;
 Point *y;
 Point *w;
 Point *h;
 public:
 Polygon (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
  {
   x = new Point(x1,y1);
   y = new Point(x2,y2);
   w = new Point(x3,y3);
   h = new Point(x4,y4);
  };
 void Show()
  {
   //x->Show();
   //y->Show();
   //w->Show();
   //h->Show();
   moveto(x->x,x->y);
   lineto(y->x,y->y);
   lineto(w->x,w->y);
   lineto(h->x,h->y);
   lineto(x->x,x->y);
  };
};
//---------------------------------------------------------------------------
int main()
{
 int driver=9; //VGA
 int mode=2; //640x480 16 colors
 initgraph(&driver,&mode,"C:\\misc\\soft\\tc\\bgi\\\0");
 Polygon *p = new Polygon(0,0,10,0,10,10,0,10);
 p->Show();
 getch();
 closegraph();
 return 0;
}
//---------------------------------------------------------------------------

Re: Помогите Исправить Ошибки в Программе

Добавлено: 27 сен 2009, 12:24
Airhand
MiReQ
Зачем protected, если нигде нет наследования ?
По-умолчанию, в классе члены - private.

Re: Помогите Исправить Ошибки в Программе

Добавлено: 27 сен 2009, 12:30
MiReQ
Airhand писал(а):MiReQ
Зачем protected, если нигде нет наследования ?
По-умолчанию, в классе члены - private.
Тогда 2 вопроса:
1) В class Polygon мы обращаемся к Point::x и Point::y. Будут ли они видны ему, если В Point они private (даже если Polygon дружественный к Point)?
2) Это ведь только указания компилятору (даже просто IDE...), в реализации (в байткоде) разницы не будет? Или я ошибаюсь?

Re: Помогите Исправить Ошибки в Программе

Добавлено: 27 сен 2009, 22:05
Romeo
У Luxian была правильно спроектированы классовые отношения. Класс Point умел сам себя отображать, потому ему не нужно было обеспечивать доступ к своим данным. Недостаток программы Luxian'а был в том, что программа была не дописана и, как следствие, не работала.

MiReQ исправил программу и довёл её до рабочего состояния. Это хорошее умение для программиста. Однако на этом вынужден остановить поток похвал в адрес MiReQ'а: хотя его программа работает, тем не менее ставлю ему 2 за архитектуру приложения. То, что ты использовал protected область видимости - это, на самом деле, мелочь. Protected там действительно не нужен, но он и не нарушает идеологию отношений классов. Это всего лишь мелкое излишество, которое никому не мешает. Самое же большое зло в этом коде - это надпись friend. Квалификатор friend полностью нарушает принципы сокрытия данных. Это огромный минус для архитектуры.

Вот каким образом должен примерно выглядеть код.

Код: Выделить всё

#include "graphics.h"
#include "iostream.h"
#include "conio.h"

//---------------------------------------------------------------------------
class Point
{
public:
   Point(int x, int y) :
      m_x(x), m_y(y)
   {}
   void Show()
   {
      putpixel(m_x, m_y, 15);
   }
   void MoveTo()
   {
      moveto(m_x, m_y);
   }
   void LineTo()
   {
      lineto(m_x, m_y);
   }

private:
   int m_x;
   int m_y;
};

class Line
{
public:
   Line(const Point& p1, const Point& p2) :
      m_p1(p1), m_p2(p2)
   {}
   void Show()
   {
      m_p1.MoveTo();
      m_p2.LineTo();
   }

private:
   Point m_p1;
   Point m_p2;
};

class Polygon
{
public:
   Polygon(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) : 
      m_a1(Point(x1, y1), Point(x2, y2)),
      m_a2(Point(x2, y2), Point(x3, y3)),
      m_a3(Point(x3, y3), Point(x4, y4)),
      m_a4(Point(x4, y4), Point(x1, y1))
   {};
   void Show()
   {
      m_a1.Show();
      m_a2.Show();
      m_a3.Show();
      m_a4.Show();
   };

private:
   Line m_a1;
   Line m_a2;
   Line m_a3;
   Line m_a4;
};

//---------------------------------------------------------------------------
int main()
{
   int driver = 9; //VGA
   int mode = 2; //640x480 16 colors
   initgraph(&driver, &mode, "C:\\misc\\soft\\tc\\bgi\\\0");
   Polygon p(0, 0, 10, 0, 10, 10, 0, 10);
   p.Show();
   getch();
   closegraph();
   return 0;
}

Re: Помогите Исправить Ошибки в Программе

Добавлено: 27 сен 2009, 23:13
MiReQ
Romeo
Согласен. Я пока не совсем понимаю смысл fiend и private/public/protected, пару лет знаю C/C++ по учебной программе... Может, краткий экскурс?..

По поводу Вашего кода:

Вопросы:
Эмм... что это?

Код: Выделить всё

   Point(int x, int y) :
      m_x(x), m_y(y)
   {}
и в чем отличие от:

Код: Выделить всё

   Point(int x, int y)
   {m_x=x; m_y=y;};
интереса ради, что означает m? Или просто случайно взятая приставка?

Код: Выделить всё

class Point
...
private:
   int m_x;
   int m_y;
...

Re: Помогите Исправить Ошибки в Программе

Добавлено: 28 сен 2009, 00:04
Romeo
Обновил код в своём сообщение.

Экскурс - не проблема. Квалификатор friend открывает доступ ко всем секциям текущего класса для того объекта (класса или функции), который указан сразу после квалификатора. Таким образом, если мы предусматривали, что некий член класса должен быть сокрыт от внешнего мира, использованием этого квалификатора мы рушим наш первоначальный план, что может привести к нежелательным и неожиданным "прямым записям" в наши поля данных (в обход валидации) и иным неприятным последствиям.

Квалификаторы доступа. Public - члены класса видны и внешнему, и внутреннему миру без ограничений. Protected - члены класса видны внутри класса, а также видны наследникам класса. Private - члены класса видны только внутри.

Далее по вопросам.
&quot писал(а):Эмм... что это?
cpp Код:

Point(int x, int y) :
m_x(x), m_y(y)
{}
Это список инициализации.
&quot писал(а):и в чем отличие от:
cpp Код:

Point(int x, int y)
{m_x=x; m_y=y;};
Отличие кардинально. В случае использования списка инициализации, поля класса будут проинициализированы указанными значениями. Во втором случае, они вначале будут проинициализированы значениями по умолчания (так как список инициализации пуст), а затем им будут присвоены новые значения в теле конструктора. Понятия "инизиализация" и "присваивание" являются краеугольными понятиями С++ и понимание разницы между ними в значительной мере облегчает восприятие всех тонкостей этого языка.
&quot писал(а):интереса ради, что означает m? Или просто случайно взятая приставка?
cpp Код:

class Point
...
private:
int m_x;
int m_y;
...
Приставка m обозначает member (член) и дополнительно говорит программисту о том, что данная переменная является членом класса, то есть его полем. Подобный способ записи имён переменных придуман не мной. Он известен в кругах программистов как венгерская нотация.

Re: Помогите Исправить Ошибки в Программе

Добавлено: 28 сен 2009, 00:32
MiReQ
Romeo
Спасибо.

P.S. Кстати, почему у меня кнопка "СПАСИБО" есть только над моими сообщениями?..

Re: Помогите Исправить Ошибки в Программе

Добавлено: 28 сен 2009, 09:35
BBB
Romeo писал(а):В случае использования списка инициализации, поля класса будут проинициализированы указанными значениями. Во втором случае, они вначале будут проинициализированы значениями по умолчания (так как список инициализации пуст), а затем им будут присвоены новые значения в теле конструктора.
А что является в данном случае, т.е. для полей типа int "значениями по умолчания"? И есть ли вообще для типа данных int такие значения?

Re: Помогите Исправить Ошибки в Программе

Добавлено: 28 сен 2009, 09:54
Airhand
BBB писал(а):А что является в данном случае, т.е. для полей типа int "значениями по умолчания"? И есть ли вообще для типа данных int такие значения?
Для int-а - это 0.