Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на C / C++

Выпуск № 032
от 01.07.2002, 04:40

Администратор:
Имя: Коробов Н.А.
URL: Информационный ресурс
ICQ: 365124
Украина, Днепропетровск
О рассылке:
Задано вопросов: 101
Отправлено ответов: 174
Активность: 172.2 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе]


 Список экспертов, ответы которых опубликованы в данном выпуске

vitya
Статус: Опытный
Общий рейтинг: 116.91
[Подробней >>]
baldr
Статус: Профессиональный
Общий рейтинг: 121.24
URL: Сайт об ОС DOS. Всем, кто любит эту ОС!
[Подробней >>]
Blackeye
Статус: Профессиональный
Общий рейтинг: 118.8
URL: Delphi, my programms...
[Подробней >>]
 
Артём Шегеда
Статус: Профессиональный
Общий рейтинг: 124.83
URL: Пристанище неодинокого программиста
[Подробней >>]
Zloy
Статус: Доверительный
Общий рейтинг: 105.65
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 94. vitya> для класса/структуры единственный возможный вариант это class C { public: C & operator = (co... (ответов: 2)
Вопрос № 95. Здравствуйте уважаемые эксперты! Помогите понять, что есть указатель на NULL или 0 (куда он указывае... (ответов: 2)
Вопрос № 96. Возникла проблема, как узнать с какой частотой мерцает курсор текста? И как поменять эту частоту? За... (ответов: 3)
Вопрос № 97. Здравствуйте эксперты, я все насчет перегрузки бинарных операций. Цитирую: Бинарная операция += може... (ответов: 2)

Вопросов: 4, ответов: 9


 Вопрос № 94


vitya> для класса/структуры единственный возможный вариант это
class C
{
public:
C & operator = (const C & c)
{
....
}
};
А размер структуры от этого никак не измениться? точнее смещение структуры равно смещению первого поля структуры, компилятор никаких адресов методов/процедур друзей туда не пихает?



Вопрос отправлен: 27.06.2002, 10:56
Отправитель: Serzhant (Serzhant_mail@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает vitya

Добрый день, 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.


Приложение:


Вопрос отправлен: 27.06.2002, 11:30
Отправитель: carbonoid

[Следующий вопрос >>] [Список вопросов]

Отвечает vitya

Доброе время суток, 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

Возникла проблема, как узнать с какой частотой мерцает курсор текста? И как поменять эту частоту? Заранее спасибо!



Вопрос отправлен: 27.06.2002, 15:40
Отправитель: ЗасЛанец

[Следующий вопрос >>] [Список вопросов]

Отвечает Blackeye

Здравствуйте, ЗасЛанец!
Ипользуй 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. массив динамический.



Вопрос отправлен: 28.06.2002, 04:09
Отправитель: Serzhant (Serzhant_mail@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Zloy

Приветствую Вас, 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.

© 2002 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (49)
C / C++ (32)
Perl (9)
Delphi (16)
Pascal (27)
Basic / VBA (11)
Java / JavaScript (6)
PHP (7)
MySQL / MSSQL (8)
Пользователю
Windows 95/98/Me (46)
Windows NT/2000/XP (36)
"Железо" (42)
Поиск информации (21)
Администратору
Windows NT/2000/XP (19)
Linux / Unix (14)
Юристу
Гражданское право (9)
Семейное право (4)
Трудовое право (6)
КоАП (3)

Отправить вопрос всем экспертам выбранной рассылки.




be number one Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное