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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.56
insideone
Модератор
Автор FAQ
 Аватар для insideone
3630 / 908 / 48
Регистрация: 10.01.2010
Сообщений: 2,445
01.02.2010, 01:08     Внешние объекты в классе #1
Если класс исплользует какую то внешнюю переменную (например hWnd), то как будет более корректно его создать:

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

В случае с hWnd конечно не критично, ведь он у меня не изменяется, но если 1 мой класс использует данные другого которые могут меняться то поддерживать связь непонятно как. Как лучше решить этот вопрос?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rififi
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
01.02.2010, 10:53     Внешние объекты в классе #2
insideone,

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

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

Неразрешенные внешние символы/элементы C++
C++ WinAPI Внешние зависимости exe
C++ Шаблоны: неразрешенные внешние элементы
C++ Настроить сокет на внешние ip
Как правильно объявлять статические константные объекты в классе? C++

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

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

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