class CArray;
class CNode;
class CNode {
public:
int index;
CThat* that;
CNode* next;
CNode (int _index, CThat* _that, CNode* _next): index(_index), that(_that), next(_next) {}
};
class CCursor {
public:
CArray* array;
int index;
CNode* node;
CCursor(CArray* _array, int _index):
array(_array), index(_index), node (NULL){};
CCursor(CArray* _array, CNode* _node):
array(_array), index (_node-›index), node (_node){};
CCursor& operator=(CThat* _that);
operator CThat*();
CThat* operator-›();
};
class CArray {
public:
CNode* cells;
CArray(): cells(NULL) {}
CCursor operator[](int i);
};
CCursor CArray::operator[](int _index) {
CNode* pNode = cells;
while (pNode!=NULL)
{
if (pNode-›index -_index) {
return CCursor(this, pNode);
}
else pNode=pNode-›next;
}
return CCursor(this, _index);
}
CCursor& CCursor::operator=(CThat* _that) {
if (node==NULL) {
node = new CNode (index, _that, array-›cells);
array-›cells = node;
} else {
node-›that = _that;
}
return *this;
}
CCursor::operator CThat*() {
return node != NULL ? node-›that : NULL;
};
CThat* CCursor::operator-›() {
if (node == NULL) { throw 1; }
return node-›that;
}
Шаг 17 - Как НЕ создавать локальные переменные.
Что он сделал? Я не постигаю. Что нибудь особенное есть в этих словах: "Буря мглою…"? ___ Повезло ___ стрелял в него этот белогвардеец ___ и тем обеспечил бессмертие.
Лирическое отступление номер 2. Нажмите PageDown, если Вам неинтересно.
2001, апрель, 15.
Спасибо всем, написавшим отклики. Постараюсь проработать еще 3-4 больших темы и возможно бОльшую пачку маленьких идиом и приемов.
Увы, есть ограничивающие факторы: в первую очередь, это - просто тяжелый труд, а иных стимулов, кроме гордыни и тщеславия, нет. Второй фактор - текущее место работы, я подумываю его сменить. Понимаете, напрягают одноэсить, 1C в смысле, и если заставят, то шагам конец, да и деньги опять же; а я человек увлекающийся, и тем, чем занимаюсь, живу в полном смысле. Я вообще за шаги взялся потому, что решил продвинуть статус MCP до MCSD, стал учебники листать-повторять да и увлекся…
Как следствие: Если Вас заинтересовали мои шаги, и у Вас есть свободные вакансии программиста (и интересная, лучше трудная работа), прошу Вас и Ваш HR department (отдел кадров) рассматривать данные шаги как мое резюме.
Да-да, а что Вы хотите - естественно, это реклама…
Так, все, далее - заготовленный текст шага.
Иной раз найдешь какую-нибудь красивую фенечку, поразишься гению человека, ее придумавшего… и остается только жалеть, что не ТЫ это придумал, а ведь мог же, ну что тут такого! С другой стороны, широкое использование идей других людей и есть тот феномен, который позволил так быстро развиться компьютерной индустрии, и в конечном счете дающий нам работу. (Имею в виду конечно покупку Биллом Гейтсом операционки DOS в прошлом тысячелетии).
Ну ладно, будет. Перейдем к делу.
Допустим у Вас есть блажь - запретить конструирование объектов в стеке. Или другими словами - запретить создание локальных переменных. Зачем? Да как зачем - хочется и все… Ну хотя бы затем, чтобы они не удалялись при выходе за скобки. Или опять же, Вы создаете сообщения и толкаете их в очередь на обработку. Или Вы написали свой менеджер памяти (неплохое занятие кстати, позже будем разбирать управление памятью, увидите, сколь сие плодотворно). Вообще, стек и куча (stack и heap) вещи разные, у них разная скорость и вообще много разного. Смешивать никак нельзя. Ясно, для Вас это сейчас не проблема. Даже если не знали раньше, прочитали в шагах:
1. Определяем ВСЕ необходимые конструкторы.
2. ВСЕ конструкторы кладем в private или protected.
3. Рисуем производящую функцю.
Как писал Зощенко, "стою, любуюсь крепкой тарой".
Есть еще один способ. Вы будете смеяться. Или плакать. Придёте в возбуждение. Так что зажгите сигарету загодя и хорошенько затянитесь.
1. Защищаем… деструктор!
2. Рисуем разрушающую функцию.
Vous savez, деструктор только один, да к тому же виртуальный. Эх, жалко нет метакласса… да и зачем нам метакласс, я же читать не умею (авторская разрядка здесь)!
Нужно только помнить, что разрушение объекта через delete и через явный вызов деструктора есть не одно и то же. Об этом позже, когда будем ковырять память.(Автор после разрядки мгновенно засыпает.)