vitya> для класса/структуры единственный возможный вариант это class C { public: C & operator = (const C & c) { .... } }; А размер структуры от этого никак не измениться? точнее смещение структуры равно смещению первого поля структуры, компилятор никаких адресов методов/процедур друзей туда не пихает?
Добрый день, Serzhant! если честно, то я не понял последнего вопроса, просто пиши код присваивания. class C { ... public: C & operator = (const C & c) { if (&c != this) { str = (char *)realloc(strlen(c.str) + 1); strcpy(str, c.str); } return *this; } protected: char * str; } Ответ отправлен: 27.06.2002, 11:10 Отправитель: vitya Отвечает baldr
Здравствуйте, Serzhant! Никаких функций, кода и еще подобной дряни компилятор, естественно в экземпляр класса не пихает! Просто ты говоришь ему, что все, что относится к данному классу надо обрабатывать так-то и такой-то функцией(ми). Тем более в скомпилированной программе ты уже точно (если поработать дизассемблером) не найдешь и следа такой оранизации как класс - это понятие введено исключительно для человека. В памяти находятся только данные. Код - отдельно и вообще в друом сегменте.
Ответ отправлен: 28.06.2002, 00:37 Отправитель: baldr
Вопрос № 95
Здравствуйте уважаемые эксперты! Помогите понять, что есть указатель на NULL или 0 (куда он указывает в физическом смысле). Будет ли ошибка, если написать такой код: (см. приложение). Если не трудно, дайте разьяснение по каждой строке кода с вопросом. Заранее благодарен, carbonoid.
Доброе время суток, carbonoid! работать не будет, объект потеряется, будет утечка памяти и исключение, программа вылетит. А указывает он на 0 ячейку памяти, которая зарезервированна и использоваться так просто не может. Ответ отправлен: 27.06.2002, 11:43 Отправитель: vitya Отвечает baldr
Приветствую Вас, carbonoid! Поздравляю тебя и меня! Это - мой 200-й ответ! :) Гм... сорри... Когда ты присваиваешь указателю a адрес какой-то области памяти, а у тебя она выделяется динамически, то ты можешь обращаться к этой области как к обычной переменной, правда, через разыменование указателя. Это все ОК. Теперь: когда ты присваиваешь этому указателю NULL, ты содержимое этого указателя, а точнее, адрес выделенной памяти, теряешь!!! И указатель a указывает на какой-то левый участок памяти, в котором, в принципе, могут быть какие-то чужие важные данные. И присваивать туда что бы то ни было категорически запрещено!. А тем более использовать delete a ты совершенно невправе!! Вообще, будь повнимательнее с указателями - это чрезвычайно мощная и опасная штука, однако с ее помощью можно творить
классные вещи. Как-то слышал такой анекдот: "При словосочетании pointer error настоящий программист бледнеет и прячется под стол". :)
Ответ отправлен: 28.06.2002, 00:39 Отправитель: baldr
Вопрос № 96
Возникла проблема, как узнать с какой частотой мерцает курсор текста? И как поменять эту частоту? Заранее спасибо!
Здравствуйте, ЗасЛанец! Ипользуй GetCaretBlinkTime, или SetCaretBlinkTime. Выдержка из WinAPI в приложении.
Приложение: Ответ отправлен: 29.06.2002, 10:32 Отправитель: Blackeye Отвечает baldr
Здравствуйте, ЗасЛанец! Сидишь с секундомером перед монитором и считаешь... :)) А чтобы изменить, то могу предложить следующий вариант: гасишь курсор и, перехватив прерывание от таймера, рисуешь свой! Можно даже многоцветный сделать! ;)
Ответ отправлен: 28.06.2002, 00:40 Отправитель: baldr Отвечает Артём Шегеда
Добрый день, ЗасЛанец!
UINT GetCaretBlinkTime(VOID)
Return Values
If the function succeeds, the return value is the blink time, in milliseconds.
BOOL SetCaretBlinkTime(UINT uMSeconds);
Parameters
uMSeconds Specifies the new blink time, in milliseconds.
Return Values
If the function succeeds, the return value is nonzero.
Вообще, в Windows курсор текста - CARET. Поищи в help'е это слово: должно помочь.
В текстовом режиме управлять частотой мерцания курсора невозможно - это реализовано аппаратно. Ответ отправлен: 27.06.2002, 16:03 Отправитель: Артём Шегеда
Вопрос № 97
Здравствуйте эксперты, я все насчет перегрузки бинарных операций. Цитирую: Бинарная операция += может быть перегружена как функция, не являющаяся элементом, с двумя аргументами, один из которых должен быть объектом класса или или ссылкой на объект класса. Пример: Если y и z объекты класса string или ссылки на него, то y += z рассматривается как вызов operator+=(y, z) активизирующтй объявленную ниже дружественную функцию не элемент. class string{ friend string &operator+=(string &, const string &0); Конец цитаты. Теперь собственно проблема, есть у меня структура, и объект где эта структура- поле class array { friend sCell &operator = (sCell &, const sCell &); ... public: ... private: sCell *ptr; size; }; friend sCell &operator = (sCell &left, const sCell &right) { ... } так вот компилятор на все это
хозяйство выдает следующее: 'operator =' must be a member пробовал и в структуре прописывать друга, то же самое, так может кто подскажет как перегрузить оператор присваивания для элемента массива? Не обязательно дружественной функцией можно и функцией класса. И еще проблема вернуть ссылку на элемент массива. p.s. массив динамический.
Приветствую Вас, Serzhant! Ну насколько мне известно всё должно быть как-то так: class A{ public: int a, b, c; A& operator = (int f) { a = b = c = f; return *this; } A& operator = (const A& x) { a = a.x; b = b.x; c = c.x; return *this; } } А оператор = не может быть дружественным! Об этом у и говорит компилятор!
Ответ отправлен: 29.06.2002, 15:29 Отправитель: Zloy Отвечает vitya
Приветствую Вас, Serzhant! ну правильно он все тебе говорит, оператор = должен быть членом класса/структуры sCell а не array, убери friend, убери первый параметр и делай его членом структуры sCell. Ответ отправлен: 28.06.2002, 09:54 Отправитель: vitya
Форма отправки вопроса
Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook"
и "Microsoft Outlook Express". В программе The Bat!
подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте,
что в некоторых браузерах могут стоять запреты на открытие других
окон, а также "чрезмерное" кэширование данных,
при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet
Explorer 5.0+ или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.