| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Сравнить два указателя |
| Автор: borisbn 9.10.2012, 08:57 | ||||||
| Здравствуйте. Имеется два интерфейса
и такой класс
Т.е. я хочу сделать следующее: если пользователь класса MainSystem наследовался от обоих интерфейсов и передал мне один и тот же указатель, то удалять его нужно один раз. Если он сделал два независимых наследника, то удалять нужно обоих. Вопрос: как мне узнать какой вариант выбрал пользователь ? P.S. Я пробовал наследовать оба интерфейса он некоего Base (пустого) и сравнивать не A* и B*, а Base* и Base*, но тоже безрезультатно.
http://liveworkspace.org/code/e9bc0e79aa98419521be0bfdb490cee3 |
| Автор: borisbn 9.10.2012, 09:38 |
| Для того, чтобы счётчик увеличился до 2-х нужно, чтобы этот счётчик был единым для обоих указателей (A* и B*). Если добавить счётчик в Base, то будут создано 2 счётчика... В общем, не пойму как реализовать подсчёт ссылок для данного случая. http://liveworkspace.org/code/d06d40d334085eb9b8bacf146f26a30b |
| Автор: baldina 9.10.2012, 10:02 |
| delete 0 не вызывает неприятностей, поэтому удаляйте оба, только после удаления каждого присваивайте 0 Добавлено через 2 минуты и 49 секунд но вообще-то тут где-то логическая неувязка, несоответствие RAII: кто владелец указателей? наконец, можно умные указатели использовать |
| Автор: mabrarov 9.10.2012, 10:13 |
| Вообще, правильные варианты уже предложили. Но если очень хочется, то можно через http://liveworkspace.org/code/286c0a4a56c85823b1e7a4d63a1f16c6 |
| Автор: Alexeis 9.10.2012, 10:35 | ||
А зачем реализовывать счетчик в интерфейсах? Реализуй его в конечном классе. Ты же написал в начале поста, что у тебя интерфейс. Интерфейс не предполагает использование полей данных внутри себя. Наследуй интерфейс от IUnknown и реализуй в конечном классе для обоих интерфейсов. |
| Автор: borisbn 9.10.2012, 10:38 |
| baldina, у меня же два указателя... соотв. присваивая 0 одному другой-то не поменяется... mabrarov, спасибо! Именно то, что нужно. Век живи, век учись... /me пошёл читать про виртуальное наследование |
| Автор: Alexeis 9.10.2012, 10:39 | ||
Я для наследования 2х интерфейсов делал вот такой класс заготовочку.
Наследуюсь от него и имею общий счетчик ссылок. |
| Автор: borisbn 9.10.2012, 11:36 |
| Alexeis, спасибо, понятно. Но мне не очень подходит, т.к. я хочу минимизировать требования к пользователям моего класса MainSystem. Т.е. хочешь наследоваться только от одного интерфейса - пожалуйста, хочешь от двух - без проблем... как-то так... |
| Автор: Alexeis 9.10.2012, 12:03 | ||
Так в чем вопрос? Это пример как делается один счетчик на 2 интерфейса. В общем-то в твоем случае QueryInterface не нужен, просто если наследоваться от IUnknown, то можно использовать умный указатель ComPtr<> . Кстати, в бусте есть умный указатель с внешним счетчиком ссылок, тогда можно совсем не связываться с комом boost::intrusive_ptr |
| Автор: baldina 9.10.2012, 14:30 |
| Автор: maxim1000 9.10.2012, 18:48 | ||
|
| Автор: borisbn 9.10.2012, 19:42 | ||
хммммммм. сначала увидел это сообщение с мобильного и проверить не было возможности (привет boostcoder'у))) и думал ответить, что это - ерунда, но потом добрался до "большого" компа - проверил - работает. интересно, а что делает dynamic_cast для void* ???? maxim1000, не подскажешь, ты до этого методом тыка дошёл или прочитал где ? Если второе - дай ссыль, плиз. И ещё вопрос - это случайно в gcc так получается или это чётко по стандарту ? Спасибо. Добавлено через 2 минуты и 29 секунд Кстати, первое, что я попробовал - это
и оно не отработало. reinterpret_cast и static_cast - тоже. |
| Автор: Alexeis 9.10.2012, 20:10 | ||||
|
| Автор: maxim1000 9.10.2012, 22:48 | ||
когда-то обсуждали вопросы для собеседований, вот со мной и поделились |