LINUX.ORG.RU

Не могу сделать метод обратного вызова. Что-то странное со статическими данными

 , , ,


0

3

Пишу небольшую обертку для старого легаси.

Задача: сделать класс с методом, который будет использоваться как коллбек.

Класс примерно такой:

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.

Я понимаю, что тут еще надо городить синглтон, но принципиально пока вопрос не в этом. Вопрос в том, что почему-то не работает доступ к статическим данным класса внутри самого класса. Хотя вроде как использование статических данных внутри класса не должно отличаться от использования обычных.

★★★★★

Ответ на: комментарий от Xintrea

А тебе о чем говорили? Тебе в самом начале сказали, что у тебя нет определения переменной.

Dudraug ★★★★★
()
Ответ на: комментарий от Xintrea

Не надо преумножать говнокод, всегда оставляй код в лучшем состоянии чем был до твоих правок

P.S. светофоры должны умереть

anonymous
()
Ответ на: комментарий от Xintrea

Я скинул пример работающего кода намекающий на это уже давным давно.

Deleted
()
Ответ на: комментарий от anonymous

Этот паттерн называется рекапчте я вращение придавал

anonymous
()
Ответ на: комментарий от panter_dsd

std::function не приводится к указателю на функцию по известным причинам. Если необходимо просовывать указатель на функцию в сишный API, то подходят только статические методы.

trex6 ★★★★★
()
Ответ на: комментарий от anonymous

может там есть какой-нибудь void* UserData

Ты сигнатуру колбэка видел? Даже если в структуре есть UserData, оно в колбэк не передаётся.

anonymous
()

Метод getChar() статический, потому что только такие методы можно использовать как функции обратного вызова.

Не верно. Можно обычные методы созданного объекта использовать в качестве кэлбэков.

rumgot ★★★★★
()
С гигантской азбукой под мышкой.
Не прочитал ни одной книжки.

это про автора.

автор, нельзя впихнуть не впихуемое, если ты конечно понимаешь о чём я.

anonymous
()
Ответ на: комментарий от anonymous

Откуда ты знаешь что там есть? Это фантазии автора, а не настоящий код

anonymous
()

Тред не читал.

Почему-то класс перестает видеть свой член file

Ну растолстел он. Смотрит вниз, а пузо мешает член увидеть.

статический, потому что только такие методы можно использовать как функции обратного вызова

Сделай иначе, паблик НЕ статик метод в родительском классе.

deep-purple ★★★★★
()
Ответ на: комментарий от anonymous

Ты опять выходишь на связь?

На какую связь, вы там совсем от мира оторвались?

По поводу моего ответа, я дал подсказку, а не решение.
О сигнатуре в топике ничего не сказано, а значит я могу сделать ее такой, которая нужна мне.

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.