![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Здравствуйте.
Имеется два интерфейса
и такой класс
Т.е. я хочу сделать следующее: если пользователь класса MainSystem наследовался от обоих интерфейсов и передал мне один и тот же указатель, то удалять его нужно один раз. Если он сделал два независимых наследника, то удалять нужно обоих. Вопрос: как мне узнать какой вариант выбрал пользователь ? P.S. Я пробовал наследовать оба интерфейса он некоего Base (пустого) и сравнивать не A* и B*, а Base* и Base*, но тоже безрезультатно.
http://liveworkspace.org/code/e9bc0e79aa98...1be0bfdb490cee3 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Обычно делается подсчет ссылок. 2 раза присвоил, то счетчик ссылок +2. Вместо удаления уменьшаешь счетчик ссылок. Когда он станет равен нулю, то функция релиз удаляет объект сама. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Для того, чтобы счётчик увеличился до 2-х нужно, чтобы этот счётчик был единым для обоих указателей (A* и B*). Если добавить счётчик в Base, то будут создано 2 счётчика... В общем, не пойму как реализовать подсчёт ссылок для данного случая.
http://liveworkspace.org/code/d06d40d33408...8bacf146f26a30b -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
delete 0 не вызывает неприятностей, поэтому удаляйте оба, только после удаления каждого присваивайте 0
Добавлено через 2 минуты и 49 секунд но вообще-то тут где-то логическая неувязка, несоответствие RAII: кто владелец указателей? наконец, можно умные указатели использовать Это сообщение отредактировал(а) baldina - 9.10.2012, 10:03 |
|||
|
||||
| mabrarov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 12.1.2011 Где: Казань Репутация: 8 Всего: 9 |
Вообще, правильные варианты уже предложили.
Но если очень хочется, то можно через виртуальный базовый класс. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
А зачем реализовывать счетчик в интерфейсах? Реализуй его в конечном классе. Ты же написал в начале поста, что у тебя интерфейс. Интерфейс не предполагает использование полей данных внутри себя. Наследуй интерфейс от IUnknown и реализуй в конечном классе для обоих интерфейсов. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
baldina, у меня же два указателя... соотв. присваивая 0 одному другой-то не поменяется...
mabrarov, спасибо! Именно то, что нужно. Век живи, век учись... /me пошёл читать про виртуальное наследование -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Я для наследования 2х интерфейсов делал вот такой класс заготовочку.
Наследуюсь от него и имею общий счетчик ссылок. Это сообщение отредактировал(а) Alexeis - 9.10.2012, 10:40 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Alexeis, спасибо, понятно. Но мне не очень подходит, т.к. я хочу минимизировать требования к пользователям моего класса MainSystem. Т.е. хочешь наследоваться только от одного интерфейса - пожалуйста, хочешь от двух - без проблем... как-то так...
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Так в чем вопрос? Это пример как делается один счетчик на 2 интерфейса. В общем-то в твоем случае QueryInterface не нужен, просто если наследоваться от IUnknown, то можно использовать умный указатель ComPtr<> . Кстати, в бусте есть умный указатель с внешним счетчиком ссылок, тогда можно совсем не связываться с комом boost::intrusive_ptr -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
||||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
-------------------- qqq |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
хммммммм. сначала увидел это сообщение с мобильного и проверить не было возможности (привет boostcoder'у))) и думал ответить, что это - ерунда, но потом добрался до "большого" компа - проверил - работает. интересно, а что делает dynamic_cast для void* ???? maxim1000, не подскажешь, ты до этого методом тыка дошёл или прочитал где ? Если второе - дай ссыль, плиз. И ещё вопрос - это случайно в gcc так получается или это чётко по стандарту ? Спасибо. Добавлено через 2 минуты и 29 секунд Кстати, первое, что я попробовал - это
и оно не отработало. reinterpret_cast и static_cast - тоже. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Alexeis |
|
||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
когда-то обсуждали вопросы для собеседований, вот со мной и поделились -------------------- qqq |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |