Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.56
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
#1

Внешние объекты в классе - C++

01.02.2010, 01:08. Просмотров 1169. Ответов 11
Метки нет (Все метки)

Если класс исплользует какую то внешнюю переменную (например hWnd), то как будет более корректно его создать:

C++
1
2
3
4
5
6
class MyClass {
private:
   HWND* _myWnd;
public:
   MyClass(HWND* extWnd, ...) :_myWnd(extWnd);
}
Или нормально создать hWnd глобальным и в классе прописать extern?

В случае с hWnd конечно не критично, ведь он у меня не изменяется, но если 1 мой класс использует данные другого которые могут меняться то поддерживать связь непонятно как. Как лучше решить этот вопрос?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2010, 01:08     Внешние объекты в классе
Посмотрите здесь:

Внешние функции в классе - C++
del

Неразрешенные внешние элементы в классе - Visual C++
Суть задачи передать в функцию set текст с последующим использованием его в print (где также производятся расчеты). Пробовал создавать...

Как правильно объявлять статические константные объекты в классе? - C++
В классе надо объявить статичные константные строки. Типа class A { public: static const std::string OLOLO = "ololo"; } Но так...

не видны переменные и объекты которые глобально объявлены в классе - C++
Здравствуйте. У меня следующая проблема: Делал прогу месяц назад, но по причине отъезда ее забросил. Сейчас на другом компе...

внешние функции - C++
Всем привет! Сижу,туплю: В задании написано: "тип данных является струкурой с необходимыми полями, а операции реализуются как...

Внешние зависимости exe - C++ WinAPI
можно ли упаковать в exe файл в таблицу экспорта функции, которые будут им же и исполняться? например, если программа использует функции...

Внутренние и внешние связи - C++
int externalint=5; const int j=10; int main() { } В книге написано,что переменная externalint имеет внешнюю связь,а...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
01.02.2010, 10:53     Внешние объекты в классе #2
insideone,

если 1 мой класс использует данные другого которые могут меняться то поддерживать связь непонятно как

для этого придумали такое слово как "инкапсуляция", и другие страшные слова
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
01.02.2010, 17:11  [ТС]     Внешние объекты в классе #3
Да, к сожалению моя теоритическая база ограничилась малым
Инкапсуля́ция — свойство языка программирования, позволяющее объединить данные и код в объект и скрыть реализацию объекта от пользователя (прикладного программиста). При этом пользователю предоставляется только спецификация (интерфейс) объекта. Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью директив: public, private, protected.
Да,
C++
1
2
private:
   HWND* _myWnd;
Он скрыт т.е. инкапсулирован. Я просто хочу понять это грамотно так делать - создавать в классах члены-ссылки которые им нужны или же в каждом методе требовать их?
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
01.02.2010, 19:07     Внешние объекты в классе #4
HWND можно преспокойно хранить по значению - это всего лишь void *. Целесообразность передачи в функции вместо хранения зависит от обстоятельств. Если каждый объект жёстко ассоциируется с одним и тем же окном и ни с каким другим, то можно хранить. Если такой жёсткой привязки нет, надо передавать как параметр, никуда не денешься.
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
01.02.2010, 19:29  [ТС]     Внешние объекты в классе #5
Логично... спасибо!) Про HWND... подсвечивается что это ссылка на struct { int unused; } впрочем не важно, просто интересные непонятные вещи))
А HWND разве не может изменить? Допустим есть глобальный HWND я инициализирую объект с параметром HWND который текущий, а потом где то hWnd = CreateWindow(...) и объект будет работать с пустым указателем? Может лучше хранить HWND* ... получается void** это нормально?)
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
01.02.2010, 20:09     Внешние объекты в классе #6
Обычно не имеет смысла создавать такой объект (присобаченный к окну, но не владеющий им) до того, как становится известным hwnd. Если же твой объект может владеть окном, то получать hwnd лучше в конструкторе и освобождать в деструкторе.
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
04.02.2010, 15:40  [ТС]     Внешние объекты в классе #7
Опять получилась нестыкова. WndProc - функция которую вызывает Windows для обработки событий. Однако в этих событиях мне нужно получать доступ к объектам, а как это сделать если не сделать глобальной переменной. В смысле не глобального объекта а глобальной переменной-указателя. Или это не зазорно? Как поступить правильно?
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
04.02.2010, 18:37     Внешние объекты в классе #8
Ну учитывая, что WinProc вызывается виндами, тут просто другого выхода нет. Не прокрадываться же ночью в Microsoft и не патчить виндовый код. Но глобальные переменные должны быть загнаны в резервацию и их должно быть мало. Лучше, если одна.
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
04.02.2010, 19:02  [ТС]     Внешние объекты в классе #9
Даже маленький указатель так страшен?)
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
04.02.2010, 19:56     Внешние объекты в классе #10
Указатели-то как раз и есть самое страшное.
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
04.02.2010, 22:43  [ТС]     Внешние объекты в классе #11
Так допустим если в WndProc мне нужен какой то объект, который инициализируется в другом месте то как быть? Заводить глобальный объект или указатель? Чем страшны ссылки? Я очищу её если объект будет уничтожен, и буду проверять в том месте где она используется для доступа к объекту.

Добавлено через 2 минуты
Или допустим такая ситуация: у меня есть таймер, который так же считает FPS. Таймер оказывается полезным в разных объктах. В принципе он как бы выглядит глобальным объектом по логике. Однако все даю всем объектам его указатель чтобы знали... так же лучше?

Добавлено через 2 часа 5 минут
С переходом на систему связей столкнулся что теперь многие переменный оказались в мусоре и я к этому был не готов. Получается теперь в конструкторах везде нужно прописывать memset... но как? Почленно или можно сразу this замемсетить а дальше инициализировать все что нужно? Если при этом выше есть список инициализации то memset убьет их? Как поступить в данном случае грамотно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2010, 17:16     Внешние объекты в классе
Еще ссылки по теме:

Настроить сокет на внешние ip - C++
Ситуация такая. Создается сокет, и подключается к серверу. Если сервер локальный то все норм. Если указываю внешний IP то при connect()...

Неразрешенные внешние символы/элементы - C++
появились такие ошибки error LNK1120: неразрешенных внешних элементов: 1 error LNK2019: ссылка на неразрешенный внешний символ...

Подскажите про внешние зависимости - C++
Всем привет. Никак не могу подключить к проекту внешние зависимости. Собираю консольное приложение в VS6. Прописываю пути в настройках...

Шаблоны: неразрешенные внешние элементы - C++
Пишу шаблонный класс-массив. Появилась такая проблема. Если инициализировать конструктор и дружественные перегрузки операторов в самом...

Как получить внешние параметры в ActiveX? - C++
День добрый всем! Есть у меня Activex-компонент. Он должен связываться с сервером и открывать указанный ему файл. Имя файла задаётся...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
05.02.2010, 17:16     Внешние объекты в классе #12
Пользуйся только списком инициализации.
Yandex
Объявления
05.02.2010, 17:16     Внешние объекты в классе
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru