kea |
Отправлено: 05.01.2006, 14:11 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 80
|
Здравствуйте! Использую следующий класс для создания сообщения об
исключительной ситуации:
CODE |
class EMsg
{
public:
EMsg(void) {};
EMsg(const AnsiString iMsg) : Message(iMsg) {};
protected:
AnsiString Message;
};
class EInvVal : EMessage
{
public:
EInvVal {};
EInvVal(const char *Msg)
{ Message = AnsiString(Msg); };
AnsiString CreateMessage(AnsiString Name,const int Value,const int a,const int B)
{
AnsiString Result("\"");
Result += Name + "\"";
return Format( Message,OPENARRAY( TVarRec,(Result,Value,a,B) ) );
};
};
EInvVal invval("Значение параметра %s (%d)выходит за границы дипазона [ %d; %d ]!");
|
Подключаю к этот файл другим файлам, выдается предупреждение линкера, о том что
экземляр класса объявлен в обоих модулях и во-вторых при попытке получить сообщение
от данного объекта выдается пустая строка, поскольку в классе EinvVal атрибут
Message равен NULL. Помогите разобраться с ошибками.
Отредактировано Gedeon — 05/01/2006, 14:40 |
|
kea |
Отправлено: 05.01.2006, 14:14 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 80
|
извините. Вместо смайлика, должна стоять имя переменной b типа const int — правая граница диапазона. Почему символ b так проинтерпретировался? |
|
Gedeon |
Отправлено: 05.01.2006, 14:49 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
В любом h файле посмотрите 2 первые строки и последнюю, найдите разницу со своим и устраните.
|
|
kea |
Отправлено: 05.01.2006, 17:39 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 80
|
QUOTE (Gedeon @ 05/01/2006, 14:49) | В любом h файле посмотрите 2 первые строки и последнюю, найдите разницу со своим и устраните. |
Здравствуйте!
Разумеется я записал в своем файле эти три строки:
2 в самом начале:
#ifndef mymsgH
#define mymsgH
и 1 в конце:
#endif
иначе была бы ошибка компиляции, поскольку данный h-файл подключаю к ряду других файлов проекта. В моем случае получаю предупреждение linker'а, о том что invval объявлен в обоих модулях и ошибку работы, о которой написал выше и в которой хочу разобраться.
|
|
Asher |
Отправлено: 09.01.2006, 10:02 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Привет.
extern Вас спасет.
А вообще по теме "что не следует включать в заголоки" смотри
Б.Страуструп.
Язык программирования С++. 3-е издание.
9.2.1 Заголовочные файлы
|
|
kea |
Отправлено: 11.01.2006, 01:39 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 80
|
QUOTE (Asher @ 09/01/2006, 10:02) | Привет.
extern Вас спасет.
|
Здравствуйте! extern уже спас. Исчезли предупреждения линкера, а вместе с ними и ошибка в работе (выдача форматированного сообщения — почему?). |
|
Asher |
Отправлено: 11.01.2006, 14:38 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Привет.
Что почему?
почему так нельзя делать?
Если сильно интересно почитайте:
Герб Саттер, Андрей Александреску
Стандарты программирования на С++
C++ Coding Standards: 101 Rules, Guidelines and Best Practices
(C++ In-Depth)
Серия: C++ In-Depth
Издательство: Вильямс, 2005 г.
224 стр.
ISBN 5-8459-0859-0, 0-321-11358-6
Совет 61. Не определяйте в заголовочном файле объекты со связыванием.
Там на двух страницах мэтры подробно объясняют почему так делать нельзя.
|
|
kea |
Отправлено: 16.01.2006, 01:06 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 80
|
Здравствуйте! Спасибо за ЦУ! В электронном виде эта книга имеется у вас? |
|
Asher |
Отправлено: 16.01.2006, 09:31 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Привет.
QUOTE | В электронном виде эта книга имеется у вас? |
у меня бумажная, но вроде на NataHaus видел скан.
мег 15 весил.
|
|
kea |
Отправлено: 19.01.2006, 18:14 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 80
|
QUOTE (Asher @ 16/01/2006, 09:31) | Привет.
QUOTE | В электронном виде эта книга имеется у вас? |
у меня бумажная, но вроде на NataHaus видел скан.
мег 15 весил. |
Здравствуйте! Спасибо, нашел её там! Встречали где-нибудь "Теория и практика C++" Шилдта (мой излюбленный вопрос), очень ищу. |
|