![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
ввопрос простой, если есть хидер super1.h и в нем объявлен как static массив:
static const char * exception_string_table[exc_str_len]; То если юзать его в file1.cpp и в file2.cpp : 1) будет общим для этих двух единиц трансляции, т.е. в местах использования в бинарном виде подставится указатель на этот массив 2) у каждого файла реализации будет своя таблица какой из пунктов ? или что вообще будет? ;) |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
mes, Мне хочется запихнуть массив в хидер, потом его подрубать и при этом хочется чтобы в местах использования подставлялся указатель на него ! как это сделать ? ;)
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
в хидере объявить extern массив и в одном .cpp его определить. Это сообщение отредактировал(а) mes - 30.3.2010, 09:08 |
|||
|
||||
| EvilsInterrupt |
|
||||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
mes, спасибо за вариант, о нем тоже думал, но он не подходит. Чтобы пояснить почему, опишу контекст решаемое сейчас задачи ;)
Есть: <library folder>\include\std_exception.h: class std_exception; // ну и реализация прямо в хидере есть либа: <library folder>\include\libio.h:
классы относятся к нэймспэйсу libio есть реализация: <library folder>\src\libio\libio.cpp:
т.к. в коде методов этой либы могут возникать ошибки, то надо бы как-то сообщать об этом пользователю. Решил что если это при создании классов, то буду генерировать исключение, а вот если менее важно, к примеру не прочитались данные, не записались то код ошибки, а вдруг пользовательский код сумеет поправить ситуацию , тогда проверка на ошибку куда быстрее по выполнению чем раскрутка исключения!!! Но ! Для реализации исключений, т.е. наследников от std_exception желательно еще кидать с текстом!!! Вопрос: где хранить массив текстовок ошибок типа const char * ? мне пришло в голову, что раз уж у меня есть <library folder>\include\detailed\libio_errors_io.h , то туда и запихну этот массив, но !!! Не сделав его как static буду получать ругань от компилятора ;( Что смущает меня при применении static ? 1) при подключении <library folder>\include\detailed\libio_errors_io.h в инклуд <library folder>\include\libio.h мы получим научим видеть пользовательский код классы исключений, но при реализации в libio.cpp мы их будем генерить! Из этого вытекает, что массив будет доступен в двух и более еденицах трансляции!!! static ведь! что можно предприянять ? ;) ЗЫ: Очень старался пояснить и надеюсь мне удалось ))) Это сообщение отредактировал(а) EvilsInterrupt - 30.3.2010, 16:38 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
mes,
>>вопрос в сторону, а зачем хранить все тексты ошибок как массив ? мне куда проще писать: throw new (e_stream_create(error_string_table[err_no])); т.е. обращаясь к табличке за текстом, чем писать текстовку по месту: throw new (e_stream_create("stream create failed")); |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну так не только этими двумя вариантами ограничен мир программирования чем не подходит, к примеру, выделение переменной под каждое сообщение ? Добавлено через 53 секунды и почему throw new ? зачем лишние заботы ? Это сообщение отредактировал(а) mes - 30.3.2010, 17:34 |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
mes, лишние new нафиг надо! ;) Уж лучше на стадии построения файла компиллером все что надо ляжет и выделится(по возможности)
Вобщем, решил, чуть позже напишу что и как именно! ;))) ЗЫ: Вопрос не закрываю, а то вдруг не то понял )) |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
крыша уже едет:
есть: class std_exception { public: std_exception(const char * const error) { m_what = error; } class e_libio_error : public std_exception {}; class e_stream_create : public e_libio_error {}; и табличко: enum EXCEPTION_NUMBER { en_strm_create = 0, EXCEPTION_NUM_MAX }; static const char * excep_str_tbl[EXCEPTION_NUM_MAX] = { "Stream create failed" }; пишу: if(m_private == 0) throw( e_stream_create( excep_str_tbl[en_strm_create] ) ); в месте использования catch(libio::e_libio_error & e) и получаю: Error 1 error C2440: '<function-style-cast>' : cannot convert from 'const char *' to 'libio::e_stream_create' ..туто путь..\libio\libio.cpp 34 dotnetdump в чем мблин трабл то ? вроде все ок! ;( где туплю ? |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
EvilsInterrupt, используй синглтон с нужным массивом
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну так где нужные конструкторы у классов исключений ? |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
>>ну так где нужные конструкторы у классов исключений ?
Пашед ;))) Но, а разве конструкторы не наследуются ? ;) Это сообщение отредактировал(а) EvilsInterrupt - 30.3.2010, 18:15 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
мне кажется это утяжеление.. имхо задача (про текст) решается через .inc файл в котором с помощью макроса описаны все строки. при включении .inc`a в хидер нужно определить макрос как объявление внешних переменных, а при включении .inc`a в .cpp -реализатор макрос определяется как опредение переменных с инициализацией.. Добавлено через 51 секунду увы ) Добавлено через 9 минут и 52 секунды если нужны подобные, но разнотипные классы исключений и неохота париться с конструкторами, то можно прибегнуть к шаблонам, например как в этой теме : http://forum.vingrad.ru/index.php?showtopi...t&p=2104028 |
|||
|
||||
| EvilsInterrupt |
|
||||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
Это решение сделал таковым:
<sdk folder>\include\detailed\libio_const_io.h:
где первое будут ловить, что бы знать о том была ли вообще ошибка! а второе и подобное ему, для конкретизации ситуации в <sdk folder>\src\libio\libio.cpp:
таким образом я добился чего хотел: (при релиз-сборке) 1) в obj-файле нет упомянания о excep_str_tbl по место использования просто адрес! 2) клиент может отловить и детализировать ошибку относящиеся к это либе 3) при этом клиент не видит массива строк, но ему это будет доступном методом в what() в классе исключения! Это. что касательно того что я хотел узнать и реализовать в момент создания темы ) >>если нужны подобные, но разнотипные классы исключений и неохота париться с конструкторами, то можно прибегнуть к шаблонам, Читал приведенный пост, но пока не понял как и чего там у вас работает. Когда знания выростут, почитаю еще раз ;) ЗЫ: Нужна ли кому тема, в которой выложу опыт и небольшие знания о том как начать писать СДК и библиотеку, что к текущему моменту наскреб ? |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |