Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

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

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

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

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

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

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

Возможно ли с помощью EGit в Eclipse добавить в репозиторий внешние библиотеки? - C++
Завёл себе репозиторий на bitbucket' e. С помощью плагина для eclipse залил туда код, но внешние библиотеки туда не попали. Можно ли всё -...

Объекты и Классы - C++
Кто ни будь, может подробно и понятно обьяснить или дать линк на статью о том, что такое Класс, и Объект?

Найти площади трех колец, для которых даны внешние и внутренние радиусы (визуальный режим) - C++ Builder
Добрый день, уважаемые программисты, студенты, а также все участники этого форума. помогите, пожалуйста, написать программу на языке C++...

Объекты синхронизации - C++ Builder
Пишу http://www.cyberforum.ru/blogs/131347/ Есть std::deque<T> - разделяемый между: 1. Главным потоком который может обращатся к...

OLE объекты - C++ Builder
Вопрос как будет выглядеть на С++ следующий код: ( взято из исходников от сюда...

объекты и классы - C++ Builder
Здравствуйте. Помогите с задачей. Нужно написать программу на классы и объекты. Пользователь вводит символьную строку, а программа...

11
Rififi
2360 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
01.02.2010, 10:53 #2
insideone,

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

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

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

Добавлено через 2 часа 5 минут
С переходом на систему связей столкнулся что теперь многие переменный оказались в мусоре и я к этому был не готов. Получается теперь в конструкторах везде нужно прописывать memset... но как? Почленно или можно сразу this замемсетить а дальше инициализировать все что нужно? Если при этом выше есть список инициализации то memset убьет их? Как поступить в данном случае грамотно?
0
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
05.02.2010, 17:16 #12
Пользуйся только списком инициализации.
0
05.02.2010, 17:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2010, 17:16
Привет! Вот еще темы с ответами:

Динамические объекты - C++ Builder
Помогите разобраться как мне сделать чтобы холст графического редактора был динамическим для пользователя. Т.е. чтобы пользователь сам смог...

Подвижные графические объекты - C++ Builder
Всем привет! Просьба поделиться опытом. Задача следующая: На объекте TImage необходимо рисовать линию (и не только). Но не просто...

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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