Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Turbo C] Определение принадлежности к классу


Автор: Dr1v3r 1.12.2004, 16:49
нужно написать прогу на турбо си

вопщем нужно спроектировать и реализовать классы графических объектов . Спроектировать и реализовать новый класс , объединяющий объекты , осуществляющий контроль состояния объектов , принадлежащим другим классам , в процессе выполнения программы.

Описание поведения объектов:
создаются несколько экземпляров графических объектов разных классов . Объект контроллер по запросу определяет принадлежность к классу существующих объектов
Добавлено @ 16:49
или если у кого есть что нить подобное выложите исходник плиз

Автор: alien_by 1.12.2004, 18:30
Вообщем не совсем понятно что нужно сделать.
Набросал небольшую иерархию классов, может быть поможет.
Класс GraphFactory - контроллер. Создаёт и идентифицирует инстансы.

Код

class GraphPrimitive
{
friend class GraphFactory;

protected:
int m_x;
int m_y;

GraphPrimitive(){}
GraphPrimitive(int x, int y)
{
 m_x = x;
 m_y = y;
}

virtual int Identify() = 0;
};

class GraphPoint : public GraphPrimitive
{
friend class GraphFactory;
protected:
GraphPoint(int x, int y)
{
 GraphPrimitive::GraphPrimitive(x, y);
}

int Identify()
{
 return 0;
}
};

class GraphCircle : public GraphPrimitive
{
friend class GraphFactory;
protected:
int m_radius;

GraphCircle(int x, int y, int r)  
{
 GraphPrimitive::GraphPrimitive(x, y);
 m_radius = r;
}

int Identify()
{
 return 1;
}
};

class GraphLine : public GraphPrimitive
{
friend class GraphFactory;
protected:
int m_endx, m_endy;

GraphLine() {}
GraphLine(int sx, int sy, int ex, int ey)  
{
 GraphPrimitive::GraphPrimitive(sx, sy);

 m_endx = ex;
 m_endy = ey;
}

int Identify()
{
 return 2;
}
};

class GraphBox : public GraphLine
{
friend class GraphFactory;
protected:
GraphBox(int sx, int sy, int ex, int ey)  
{
 GraphLine::GraphLine(sx, sy, ex, ey);
}

int Identify()
{
 return 3;
}
};

class GraphFactory
{
public:
GraphPrimitive* Point(int px, int py)
{
 return new GraphPoint(px, py);
}
GraphPrimitive* Circle(int cx, int cy, int radius)
{
 return new GraphCircle(cx, cy, radius);
}
GraphPrimitive* Line(int sx, int sy, int ex, int ey)
{
 return new GraphLine(sx, sy, ex, ey);
}
GraphPrimitive* Box(int sx, int sy, int ex, int ey)
{
 return new GraphBox(sx, sy, ex, ey);
}

void Identify(GraphPrimitive* prim)
{
 switch(prim->Identify())
 {
 case 0:
  std::cout << "This primitive is pertains to Point class." << std::endl;
  break;
 case 1:
  std::cout << "This primitive is pertains to Circle class." << std::endl;
  break;
 case 2:
  std::cout << "This primitive is pertains to Line class." << std::endl;
  break;
 case 3:
  std::cout << "This primitive is pertains to Box class." << std::endl;
  break;
 }
}
};

Автор: Dr1v3r 2.12.2004, 13:27
alien_by , спасибо , правда это немного не то .
ладно бум думать дальше smile

Автор: alien_by 2.12.2004, 15:05
Поясни плз, что конкретно тебе нужно.

Автор: bel_nikita 2.12.2004, 15:26
Цитата
правда это немного не то .

RTTI тогда smile Но разве в Турбо Си есть RTTI?
Можно еще красиво через шаблоны, но опять же Турбо Си... smile

Автор: Dr1v3r 2.12.2004, 17:25
alien_by , если более точно , то по словам препода нужно следующее :

например у нас создаются графические объекты ( кружочки квадратики , домики , окружности и т.п.) , мы тыкаем мышкой
в какой нить объект (например в кружочек) и нам говорят , что это : объект кружочек класса окружности

примерно так ... вот , помогите плиз , заранее спасибо

Автор: alien_by 3.12.2004, 11:25
[s]Вот что я могу тебе подсказать (извини, всю прогу написать немогу, нет времени, да и турбо с под рукой нет).

Как под ДОС работать с мышью.
Код

#include <dos.h>

// Инициализирует мышь, возвращает число кнопок
// _AX, _BX - стандартные переменные отражающие регистры процессора
int mouseInit()
{
  int result = 0;

  _AX = 0x0000;
  geninterrupt(0x33);
  if ( _AX == 0xFFFF )
     result = _BX;

  return result;
}

// Показывает/скрывает курсор мыши
// Если 0 - скрывает, иначе показывает
void mouseShowPointer(int show)
{
   if ( !show )
     _AX = 0x0002;
   else
     _AX = 0x0001;

   geninterrupt(0x33);
}

// Опрашивает состояние мыши
// переменная btn будет содержать закодированное значение нажатых кнопок
// btn&1 - левая кнопка, btn&2 - правая кнопка, btn&4 - центральная кнопка.
void mouseQuery(int *x, int* y, int* btn)
{
   _AX = 0x0003;
   geninterrupt(0x33);

   *btn = _BX;
   *x = _CX;
   *y = _DX;
}


Этих функций должно хватить.
Если интересуешься мышью, то поищи в нете описание фсех функций 33h препывания.

Теперь что касается графических обьектов.

Все классы которые я выкладывал подойдут и для этой задачи.
Их надо немножко модифицировать.
В класс GraphPrimitive нужно добавить два виртуальных метода.
Например
Код

....
protected:
  // будет определять находится ли указатель с координатами x, y над данным обьектом.
  virtual int IsPointInThis(int x, int y);

  // будет собственно рисовать фигуру.
  virtual void Draw();


А в наследниках определи эти методы и задай алгоритмы.
Т.е. например для круга
Код

  ...
  int  IsPointInThis(int x, int y)
  {
      if ( x >= m_radius - m_x && x <= m_radius + m_x &&
          y >= m_radius - m_y && y <= m_radius + m_y )
          return 1;
      else
          return 0;
  }

  void Draw()
  {
       setcolor(5);
       circle(m_x, m_y, m_radius);
  }


Функции рисования всех примитивов имиются в библиотеке bgi, поставляемой со всеми средами фирмы Борланд. О ней почитай в хелпе. Там всё просто.
Аналогичным образом определяешь эти функции для остальных фигур.

И последнее.
Я так понимаю, если изначально разговор вёлся о создании классов, то твоя версия поддерживает ООП, исходя из этого предпологаю, что она также поддерживает и stl.

Млдифицируем класс контроллер.
Код

...
private:
  // вектор обьектов GraphPrimitive*
  std::vector<GraphPrimitive*> m_primitives;

public:
  // модифицируем функции типа Line, Circle, Box, так, чтобы при создании они добавляли
  // созданный элемент в вектор, например
 GraphPrimitive* Circle(int cx, int cy, int radius)
 {
    GraphPrimitive* prim = new GraphCircle(cx, cy, radius);
    m_primitives.push_back(prim);
    return prim;
 }

  // Описываем метод draw, который рисует все обьекты
  void Draw()
  {
     for(std::vector<GraphPrimitive*>::iterator it = m_primitives.begin();
           it != m_primitives.end(); it++)
         *it->Draw();
  }

  // Изменяем метод Identify
  int Identify(int x, int y)
  {
     GraphPrimitive* prim;

     for(std::vector<GraphPrimitive*>::iterator it = m_primitives.begin();
           it != m_primitives.end(); it++)
         if ( *it->IsPointInThis(x, y) )
         {
             prim = *it;
             break;
         }

      // Здесь можно либо возвращать идентификатор фигуры, а потом его где-нибудь
      // анализировать, либо сразу анализоровать и выводить на экран в красивом виде
      // например в самой нижней строке экрана.

      // Я, просто возвращаю идентификатор
      return prim->Identify();
  }
  // Как ты видишь, эта функция вернёт первый попавшийся обьект, удовлетворяющий
  // позиции курсора, если обьекты не пересекаются то это нормально, однако если они        
  // пересекаются, то будет возвращён только один из них.
  // Можешь разобраться как сделать, чтобы  возвращались все обьекты пересекающиеся
  // под курсором.

  // И последнее, не забудь описать деструктор
  ~GraphFactory::GraphFactory()
  {
     for(std::vector<GraphPrimitive*>::iterator it = m_primitives.begin();
           it != m_primitives.end(); it++)
        delete *it;

     m_primitives.clear();
  }


Ну вот вроде-бы и всё..
Тебе остаётся только разобраться как работает графическая подсистема (bgi), описать недостающие методы, ну и разработать некий интерфейс. Дерзай. smile

Автор: Dr1v3r 5.12.2004, 17:22
alien_by , спасибо , очень помог

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)