AHTOXA 18 1 июня, 2012 Опубликовано 1 июня, 2012 · Жалоба PS видать это вовсе не исключения так весят а аллокатор памяти! Посмотрите map-файл, и увидите, что это всё-таки исключения. К сожалению, ключик -fno-exceptions не всегда соблюдается. Попробуйте объявить new/delete как void * operator new (size_t size, const std::nothrow_t&) throw() { ... } void operator delete(void * pobject, const std::nothrow_t&) throw() { .. } И добавьте всё же к своему проекту файл из моего предыдущего сообщения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
glonium 0 1 июня, 2012 Опубликовано 1 июня, 2012 · Жалоба Посмотрите map-файл, и увидите, что это всё-таки исключения. Я если честно не до конца разобрался как пользоваться map и как от туда узнать что сколько весит (непонятные имена функций) Подскажите пожалуйста где можно прочитать про map! Заранее спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 2 июня, 2012 Опубликовано 2 июня, 2012 · Жалоба А чего там уметь-то? Смотрите, видите "eh_exception.o" - значит, исключения присутствуют:) Ну а так, там в самом начале есть строчка: Archive member included because of file (symbol) То есть, формат такой подключенная_библиотека (имя_объекта_из_этой_библиотеки.o) имя_файла_из_за_которого_подключили_этот_библиотечный_объект (имя_функции_из_за_которой_подключили) Попробуйте сделать, как я сказал в предыдущем сообщении, думаю, что поможет. Кстати, не забудьте остальные варианты new/delete: void * operator new(size_t size){ return operator new(size, std::nothrow); } void operator delete(void * pobject){ operator delete(pobject, std::nothrow); } void * operator new[](size_t size){ return operator new(size, std::nothrow); } void operator delete[](void * pobject){ operator delete[](pobject, std::nothrow); } void * operator new[](size_t size, const std::nothrow_t&) throw(){ return operator new(size, std::nothrow); } void operator delete[](void * pobject, const std::nothrow_t&) throw(){ operator delete(pobject, std::nothrow); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
glonium 0 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба Да очень жаль конечно что всё это весит много! В проекте планировалось использовать dunamic_cast<> (RTTI) для реализации подобия интерфейсов. Народ а может кто подсказать если я использую RTTI и throw то к программе добавляется кусок порядка 80кБ, есть ли гарантия что он не вырастет необоснованно? Т.е один раз приклеился и всё больше ничего не надо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба В проекте планировалось использовать dunamic_cast<> (RTTI) для реализации подобия интерфейсов. А что такого вам даёт RTTI? Интерфейсы в С++ ведь реализуются с помощью абстрактных классов с наследованием. Этого недостаточно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
glonium 0 10 июня, 2012 Опубликовано 10 июня, 2012 · Жалоба так то так но вот предположим у нас есть список объектов базоаого класса в виде указателей на них, при помощи dynamic_cast<*Iface> можно определить поддерживает ли данный инстанс интерфейс Iface и заодно преобразовать к классу интерфейса, если не поддерживает dynamic_cast вернёт NULL! Конечно можно поступить и менее красиво, держать в классе флаги поддержки интерфейса и по их значениям кастовать! Или ещё вариант но тоже менее красивый завести виртуальные функции которые кастуют к конкретному интерфейсу! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alx2 0 11 июня, 2012 Опубликовано 11 июня, 2012 · Жалоба Народ а может кто подсказать если я использую RTTI и throw то к программе добавляется кусок порядка 80кБ, есть ли гарантия что он не вырастет необоснованно? Т.е один раз приклеился и всё больше ничего не надо! Если Вы имеете в виду библиотечный код - то гарантия полная. Библиотечный модуль может быть загружен линкером только один раз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
neiver 0 11 июня, 2012 Опубликовано 11 июня, 2012 · Жалоба так то так но вот предположим у нас есть список объектов базоаого класса в виде указателей на них, при помощи dynamic_cast<*Iface> можно определить поддерживает ли данный инстанс интерфейс Iface и заодно преобразовать к классу интерфейса, если не поддерживает dynamic_cast вернёт NULL! Конечно можно поступить и менее красиво, держать в классе флаги поддержки интерфейса и по их значениям кастовать! Или ещё вариант но тоже менее красивый завести виртуальные функции которые кастуют к конкретному интерфейсу! "флаги поддержки интерфейса" в классе - это призанак "моей первой программы на С++", часто появляются, когда люди много писали на простом Си. Опрос возможностей с помощью dynamic_cast - это уже "вторая программа на С++" - осознание недостаатков первой. Вариант с виртуальными функциями чуть лучше, но всё равно опрос возможностей или попытка узнать конкретный тип объекта почти всегда являются признаками неудачного проектирования. Этот самый тип объекта просто не нужно терять, чтоб потом не нужно было его динамически узнавать. Единственное адекватное применение опроса типа или возможностей объекта, dynamic_cast в частности и RTTI вообще - это ИМХО разработка своей библиотеки сериализации. Рекомендую по этому по этому вопросу почитать книжку: Стефан К. Дьюхэрст "Скользкие места С++". Там очень хорошо этот вопрос расписан. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
glonium 0 16 июня, 2012 Опубликовано 16 июня, 2012 · Жалоба Спасибо за книгу интересные моменты обсуждаются! Интересная картина получается!!! Чтобы избежать проблем со множественным наследованием используем интерфейсы костыльным методом, реализация интерфейсов предпологает нисходящее преобразование типов (как быть иначе я пока не вижу, вернее как узнать поддерживает ли данный инстанс интерфейс или нет), что в свою очередь нежелательно! Все методы корректного нисходящего преобразования это ошибка проектирования, а множественное наследование штука тоже не из хороших, а как тогда быть? Ведь невозможно провести классификацию сложных объектов без множественного наследования или хотя бы интерфейсов! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
neiver 0 16 июня, 2012 Опубликовано 16 июня, 2012 · Жалоба Вот! Именно для этого есть принципы SOLID. Очень рекомендую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
glonium 0 21 июня, 2012 Опубликовано 21 июня, 2012 (изменено) · Жалоба Это конечно всё понятно принципы SOLID! Вот только я не могу связать теорию с практикой, а именно пусть у нас есть список инстансов приведённых к базовому классу, есть базовый интерфейс в виде виртуальных функций, но каждый объект наследник базового класса обладает ведь по определению расширенным функционалом специфичным только ему, и как им воспользоваться следуя вышеприведённым принципам не понятно! Реализация механизма обработки событий тоже требует оператора switch только внутри каждого из наследников при обработке события! Прошу Вас подсказать как действовать в этой ситуации не нарушая принципов ООП? Изменено 21 июня, 2012 пользователем glonium Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться