Пишу небольшую обертку для старого легаси.
Задача: сделать класс с методом, который будет использоваться как коллбек.
Класс примерно такой:
class FileChannel
{
public:
FileChannel();
static int getChar(num_t Port);
bool open(const char *fileName);
void close();
protected:
FILE *file;
};
Метод getChar() статический, потому что только такие методы можно использовать как функции обратного вызова.
Реализация getChar() простая:
int FileChannel::getChar(num_t Port)
{
... некая логика с портом...
return fgetc(file);
}
Проблема в том, что данный статический метод не может работать с не-статическими данными. Ошибка будет такой:
FileChannel.cpp:39:17: error: invalid use of member ‘FileChannel::file’ in static member function
return fgetc(file);
^~~~
In file included from FileChannel.cpp:1:0:
FileChannel.h:26:11: note: declared here
FILE *file;
^~~~
Тогда я пытаюсь объявить file как static:
static FILE *file;
Но тогда не проходит линковка. Почему-то класс перестает видеть свой член file. Ошибка, например в конструкторе:
FileChannel::FileChannel()
{
file = NULL; // Тут ошибка
}
Сами ошибки выглядят вот так:
FileChannel.o: In function `FileChannel::FileChannel()':
FileChannel.cpp:6: undefined reference to `FileChannel::file'
FileChannel.o: In function `FileChannel::open(char const*)':
FileChannel.cpp:16: undefined reference to `FileChannel::file'
...
FileChannel.o:FileChannel.cpp:31: more undefined references to `FileChannel::file' follow
collect2: error: ld returned 1 exit status
make: *** [Indicator] Error 1
14:09:37: Процесс «/usr/bin/make» завершился с кодом 2.
Я понимаю, что тут еще надо городить синглтон, но принципиально пока вопрос не в этом. Вопрос в том, что почему-то не работает доступ к статическим данным класса внутри самого класса. Хотя вроде как использование статических данных внутри класса не должно отличаться от использования обычных.