Цитата
unsigned short myInt = 123;
short mySignedInt = -765;
float myFloat = 123.43;
LCD << InitScr() << myInt << ',' << mySignedInt << ',' << myFloat << myString;
И оно будет работать, т.е. мне не нужна отдельная функция для вывода на экран элемента каждого типа. Но возникает необходимость в определённых служебных операциях, например по умолчанию числа выводятся в десятичной системе, а мне нужно чтоб выводилось в шестнадцатеричной и т.д. В Си++ для "больших" компьютеров, в подобных ситуациях, используются манипуляторы ввода-вывода. Я попытался сделать здесь тоже самое. В приведённом выше примере, InitScr() - подобие манипулятора, т.е. ничего не выводит, но выполняет определённые служебные функции. short mySignedInt = -765;
float myFloat = 123.43;
LCD << InitScr() << myInt << ',' << mySignedInt << ',' << myFloat << myString;
Есть основной класс C_Lcd, где выполняется перегрузка оператора << для всех основных используемых типов. Виртуальный класс ILcdManipulator и класс InitScr, который выполняет роль манипулятора, вызывая функцию LcdScreenInitialization() класса C_Lcd.
Проблема возникает при описании функции LcdScreenInitialization(). Когда я ее описую в самом классе, например
Код
void LcdScreenInitialization()
{
PositionX = 0;
}
то работает все отлично, но когда я определяю ее за пределами класса как inline{
PositionX = 0;
}
Код
inline
void С_Lcd::LcdScreenInitialization()
{
PositionX = 0;
}
то компилятор выдает ошибку void С_Lcd::LcdScreenInitialization()
{
PositionX = 0;
}
Цитата
obj/Test.o: In function `InitScr::operator<<(C_Lcd&) const':
D:\PROJECT_M\mPDZ2\Section1\UP\Slave4\Project/class/LCD.h:70: undefined reference to `C_Lcd::LcdScreenInitialization()'
причем, если я убираю слово inline, то ошибка пропадает, но увеличивается объем памяти занимаемый программой, приблизительно на 25 байт за каждое использование InitScr() в программе. D:\PROJECT_M\mPDZ2\Section1\UP\Slave4\Project/class/LCD.h:70: undefined reference to `C_Lcd::LcdScreenInitialization()'
Вопрос! Почему при описании функции за пределами класса, с использованием ключевого слова inline, компилятор выдает ошибку, хотя вроде я ничего криминального не делаю?
З.Ы. На компютере, вариант с внешних описанием и inline'ом, компилируется без ошибок.
Вот сам код описание классов.
Код
class C_Lcd;
class ILcdManipulator
{
public:
virtual ~ILcdManipulator() {};
virtual C_Lcd & operator << ( C_Lcd & out ) const = 0;
};
class C_Lcd
{
private:
unsigned char PositionX; //Текущая позиция курсора по горизонтали [0..16(20)]
public:
C_Lcd& operator << ( const char * );
C_Lcd& operator << ( unsigned short );
C_Lcd& operator << ( short );
C_Lcd& operator << ( const ILcdManipulator& Manipulator )
{
return Manipulator.operator << (*this);
};
void LcdScreenInitialization();
C_Lcd ( void ) {
// Periphs::UART0.Init();
}
};
class InitScr : public ILcdManipulator
{
public:
virtual C_Lcd & operator << (C_Lcd& out) const {
out.LcdScreenInitialization();
return out;
};
};
class ILcdManipulator
{
public:
virtual ~ILcdManipulator() {};
virtual C_Lcd & operator << ( C_Lcd & out ) const = 0;
};
class C_Lcd
{
private:
unsigned char PositionX; //Текущая позиция курсора по горизонтали [0..16(20)]
public:
C_Lcd& operator << ( const char * );
C_Lcd& operator << ( unsigned short );
C_Lcd& operator << ( short );
C_Lcd& operator << ( const ILcdManipulator& Manipulator )
{
return Manipulator.operator << (*this);
};
void LcdScreenInitialization();
C_Lcd ( void ) {
// Periphs::UART0.Init();
}
};
class InitScr : public ILcdManipulator
{
public:
virtual C_Lcd & operator << (C_Lcd& out) const {
out.LcdScreenInitialization();
return out;
};
};