Здравствуйте, 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 не люблю и ничего, ни одной ошибки еще не было. Вот попробуй на С# повтори те упражнения что я здесь привел, тогда и поговорим.