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

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


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 575
от 07.11.2006, 11:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 407, Экспертов: 49
В номере:Вопросов: 4, Ответов: 9


Вопрос № 60968: Помогите начинающему программисту-студенту. Не могу разобраться с проклятым конструктором копирования. Расскажите для чего он используется и как реализуется, или дайте ссылку на книженцию, где этот вопрос хорошо расписан. Прошу простлать пару примеро...
Вопрос № 60982: Привет народ! Я вот пробую зделать еквалайзер на ТВ тюнер... Я типа с входа через WIN API музыку в буфер записываю, а потом проигрываю. И вот мне в етот момент перед проигрыванием надо изменить какие нибудь частоты. Немогу в инете найти принцып работ...
Вопрос № 60984: Привет снова :) Еще один вопрос. Например у меня есть переменная int х=0; Со временем она изменяется. Можно зделать так, чтобы когда она будет ровна х=75 вызвалась определенная функция, но не проверяя ее с помощю оператора if (x==75)?...
Вопрос № 60985: Как создать обработчик события? Нужно простое и подробное описание И что такое CALLBACK функция я так и немогу понять. Для чего она? Как ее создать? Может есть простые примеры использования?...

Вопрос № 60.968
Помогите начинающему программисту-студенту. Не могу разобраться с проклятым конструктором копирования. Расскажите для чего он используется и как реализуется, или дайте ссылку на книженцию, где этот вопрос хорошо расписан. Прошу простлать пару примеров с объяснениями на anonim0007@ukr.net
Отправлен: 01.11.2006, 21:22
Вопрос задал: Chupak (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Torsten
Здравствуйте, Chupak!
http://www.citforum.ru/programming/cpp_march/cpp_071.shtml
Это вывел гугл после введения запроса : конструктор копирования.
Вывод: чаще пользуйтесь поисковыми система и ответы на простые вопросы найдутся очень быстро.
---------
#define MAGIC_NUMBER 0xdeface
Ответ отправил: Torsten (статус: 2-ой класс)
Ответ отправлен: 01.11.2006, 22:34
Оценка за ответ: 2

Отвечает: Sling
Здравствуйте, Chupak!
По порядку.
Используется конструктор копирования при инициализации экземпляра класса другим, созданым ранее экземпляром этого же класса.
Выглядит это, например так:

MyClass Ekz1(10);
MyClass Ekz2=Ekz1; //в этой строке происходит вызов конструктора копирования
MyClass Ekz3;
Ekz3=Ekz1; //конструктор копирования не вызывается - переменная была создана раньше, происходит не инициализация, а присваивание

В приложении код простейшего класса с использованием (хотя здесь это и не нужно) конструктора копирования.
Конструктор копирования может пригодится в случаях, когда при создании экземпляра класса необходимо выполнять динамическое выделение памяти.

Приложение:

---------
The fear of blood tends to create fear for the flesh

Ответ отправил: Sling (статус: 3-ий класс)
Ответ отправлен: 02.11.2006, 01:22

Отвечает: Sergey A. Wedensky
Здравствуйте, Chupak!

В C++ есть два типа особых конструкторов:

+ по умолчанию (default) - не принимающий аргументов (или все аргументы
должны иметь значения по умолчанию). Он нужен, чтобы создавать
неинициализированные экземпляры, например:
CMyClass cls; // вызывается конструктор по умолчанию

+ конструктор копирования (copy constructor) - принимает один аргумент
- ссылку на этот же тип (может принимать больше, если для остальных
указаны значения по умолчанию). Нужен он для присваивания и
инициализации переменных, например:
CMyClsdd cls2 = cls; // вызывается конструктор копирования
CMyClass cls3;
cls3 = cls2; // вызывается конструктор копирования либо оператор
присваивания
Учтите, что знак '=' при инициализации - это НЕ оператор присваивания,
т.е. если Вы переопределили оператор присваивания,
const CMyClass& CMyClass::operator = (const CMyClass& cls){...}
это не поможет, если Вы хотите инициализировать экземпляры CMyClass.

Если Вы не создаете конструктора копирования, компилятор по умолчанию
его создаст, но делать он будет только почленное копирование
(memberwise copy). Если Вам нужно что-то другое, придется самому писать.

Если Вы планируете использовать Ваш класс, например, как аргумент
шаблонов STL,
vector <CMyClass> clsArray;
Вам необходимо создавать конструкторы копирования, а желательно и
операторы присваивания.

Успехов!
Ответ отправил: Sergey A. Wedensky (статус: 6-ой класс)
Ответ отправлен: 02.11.2006, 10:03

Отвечает: Хватов Сергей
Здравствуйте, Chupak!

Судя по уже поступившим ответам, вы задали не такой уж и чайницкий вопрос :-)
Это - сомнительная (на мой взгляд) особенность C++: в операторах присваивания, причем не только объекта того же класса, используются конструкторы копирования. Более того, в классе по умолчанию присутствует конструктор копирования своего класса в виде MyClass(MyClass const &src), где копируются все поля. Так что если вам нужно, чтобы при присваивании производилось что-то другое или чтобы классу вообще было присваивать, надо конструктор копирования явно описать как private (определять его не надо) а все конструкторы с одним обязательным параметром-ссылкой снабжать ключевым словом explicit.

Чем эта особенность опасна - при присваивании может произойти совсем не то, что вы хотите, особенно если для присваиваемого объекта определены операторы cast преобразования.

К слову, никакого default constructor-а по умолчанию нет!

Ответ отправил: Хватов Сергей (статус: 7-ой класс)
Ответ отправлен: 02.11.2006, 10:53


Вопрос № 60.982
Привет народ! Я вот пробую зделать еквалайзер на ТВ тюнер... Я типа с входа через WIN API музыку в буфер записываю, а потом проигрываю. И вот мне в етот момент перед проигрыванием надо изменить какие нибудь частоты. Немогу в инете найти принцып работы цыфрового еквалайзера. Как ето зделать?
Отправлен: 01.11.2006, 23:59
Вопрос задал: Etenity (статус: 7-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Bob Johnson
Здравствуйте, Etenity!
ето не просто, чуваг
обычно эквалайзер делают так:
1. входной аудиосигнал превращают в спектр быстрым преобразованием фурье (БПФ, FFT)
2. корректируют спектр с учетом настроек эквалайзера
3. обратным преобразованием Фурье получают снова аудиосигнал
если тебя заинтересовало, поищи в интернете исходники FFT (Fast Fourier Transform).
альтернативный метод - можно попробовать DirectShow аудиофильтр какой-нибудь (но это тоже требует немало знаний по программированию)
Ответ отправил: Bob Johnson (статус: Академик)
Россия, Калуга
WWW: Программирование
----
Ответ отправлен: 02.11.2006, 21:22
Оценка за ответ: 5
Комментарий оценки:
Супер. То што нада. Я какраз нашел функцию переобразования етого фурье для с++. А не подскажиш как с DirectShow работать?


Вопрос № 60.984
Привет снова :) Еще один вопрос.
Например у меня есть переменная int х=0;
Со временем она изменяется. Можно зделать так, чтобы когда она будет ровна х=75 вызвалась определенная функция, но не проверяя ее с помощю оператора if (x==75)?
Отправлен: 02.11.2006, 00:08
Вопрос задал: Etenity (статус: 7-ой класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Sergey A. Wedensky
Здравствуйте, Etenity!
Нет, нельзя, если это просто переменная.
Ответ отправил: Sergey A. Wedensky (статус: 6-ой класс)
Ответ отправлен: 02.11.2006, 09:56
Оценка за ответ: 5
Комментарий оценки:
А не просто переменная? Есть другие варианты?

Отвечает: Delph
Здравствуйте, Etenity!
Если использовать C#, то это не составит проблем. Достаточно объявить саму переменную как private и назначить public property:

...
private int x;

public int X
{
get { return x; }
set
{
if (value == 75)
... // вызываем нужную нам функцию или проводим
// нужную работу прямо здесь
x = value;
}
}
...

Здесь использована чувствительнось всех C-языков к регистру букв, поэтому название свойства (property) и название переменной похожи, различаясь только регистром.

Увы, эта технология применима только к C#, и для C++ придётся искать другой способ. К сожалению, я этого способа не знаю.
Ответ отправил: Delph (статус: 2-ой класс)
Ответ отправлен: 02.11.2006, 11:11
Оценка за ответ: 5
Комментарий оценки:
Да. Спасибо. Надо было указать шо мне на с++...

Отвечает: JohnP
Здравствуйте, Etenity!
Если придерживаться только ANSI C++, то можно использовать перегрузку оператора "=".
Но в конечном счете все способы представляют собой простое сокрытие реализации,
и проверка value==75 в том или ином виде всегда присутствует.
Ответ отправил: JohnP (статус: 2-ой класс)
Ответ отправлен: 02.11.2006, 18:25
Оценка за ответ: 5
Комментарий оценки:
Спасиб.


Вопрос № 60.985
Как создать обработчик события?
Нужно простое и подробное описание
И что такое CALLBACK функция я так и немогу понять. Для чего она? Как ее создать? Может есть простые примеры использования?
Отправлен: 02.11.2006, 00:13
Вопрос задал: Etenity (статус: 7-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Melamed
Здравствуйте, Etenity!
Фуекции типа CALLBACK - это функции так называемого обратного вызова, то есть адрес входа в такую функцию передается как параметр к другой функции, а она вызывает при определ енных событиях эту функцию.

Типичной функции обратного вызова является оконная функция, которая обрабатывает оконнын сообщения, поступающие от системы к данному окну.

LRESULT CALLBACK WndProc(HWND hWnd, UIND msg, WPARAM wParam, LPARAM lParam);
Шаблон реализации оконной функции смотри в приложении

Для того чтобы окно имело данную функцию, вам следует либо зарегистрировать новый класс окна с помощью функций RegisterClassEx или RegisterClass, лимбо поменять оконную функцию у существую 97;его окна можно с помощью функциии SetWindowLong со вторым параметром равным GWL_WNDPROC. Да не забудьте в последжнем случае сохранить старую оконную функцию с помощью функции GetWindowLong. Подроб 85;ее смотри MSDN

Приложение:

Ответ отправил: Melamed (статус: 7-ой класс)
Ответ отправлен: 02.11.2006, 11:05
Оценка за ответ: 5
Комментарий оценки:
Спасибо за толковое обяснение


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

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

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное