Re[3]: Пописал на С++... долго думал :)
От: Kluev  
Дата: 19.10.05 11:05
Оценка: +2 :)
Здравствуйте, VladD2, Вы писали:

VD>Я вижу что пишу. А от опечаток никто не застрахован. Что до языка, думаю, ты прекрасно понимашь, что никакой язык кроме С/С++ не пропустит такую лажу.


Вы просто не умеете его готовить. А я вот например наслаждаюсь возможностями С++, которые позволяют мне писать мощные интрузивные контейнеры, в частности списки.

Вот например:

class CurveVertex
{
public:
// поскипано

  ListNode    in_curve; // узел списка в Curve
  ListNode    in_apex;  // узел списка в Apex

};

// а в классах владельцах:
// ==================================================================
class Curve
{
public:
  typedef RingList<CurveNode>     NodeList;
  typedef RingList<CurveVertex>   VertexList;

  NodeList      nodes;
  VertexList    vertices;
};

// ==================================================================
class Apex
{
public:
  typedef NodeList<CurveVertex>    VertexList;

  VertexList    vertices;
};


Наиудобнейшая вещь я вам скажу! Must Have!
Из указателя я всегда имею итератор, нет тупых переборов контейнера ради поиска элементов, и память выделяется только один раз когда CurveVertex создается, а узлы списка у него уже на борту.

void demo(Apex &apx, Curve &crv)
{
  CurveVertex
    *va = apx.vertices.first(),
    *vb = new CurveVertex();

// замена вершины в нужном месте без гемороя и оверхеда:

// здесь порядок не имеет значения, пихаем в конец
  apx.vertices.push_back(vb);         // нулевой геморой, нулевой оверхед

// а здесь надо вставить куда надо:
  crv.vertices.insert_after(vb, va); // нулевой геморой, нулевой оверхед

// лишнее удаляем
  crv.vertices.cut(va); // нулевой геморой, нулевой оверхед
  apx.vertices.cut(va); // нулевой геморой, нулевой оверхед
  
  delete va;
}


Вот так вот. Крайне удобно, т.к. работаем только с указателями, которые всегда под рукой. И крайне эффективно.
Но вернемся к теме, для чего вообще я это пишу? Да просто С++ единственный язык котороый позволяет писать такие вещи без боли в области головы и заднего прохода .

А еще меня очень сильно прет partal specialization для геометрических примитивов:

template <int D, class T>
  struct Point;

template <class T>
  struct Point<2,T>
{
   T  x;
   T  y;
};

template <class T>
  struct Point<3,T>
{
   T  x;
   T  y;
   T  z;
};

На халяву имеем кучу производных примитивов и алгоритмов которые становятся двумерными илли трехмерными простым тайпдефом.

  typedef NurbsCurve<2,double> NurbsCurve2d; // нулевой геморой, нулевой оверхед
  typedef NurbsCurve<3,double> NurbsCurve3d; // нулевой геморой, нулевой оверхед


А cтрашилки про printf — это просто развод для лохов. Всю жизнь юзаю sprintf т.к. iostream не люблю и ничего, ни одной ошибки еще не было. Вот попробуй на С# повтори те упражнения что я здесь привел, тогда и поговорим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.