C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
ошибки при сипользовании глобальной, пременной — объекта класса
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++" Шилдта (мой излюбленный вопрос), очень ищу.

Вернуться в Вопросы программирования в C++Builder