Прототип функции, без определения - PullRequest
0 голосов
/ 05 ноября 2019

Я занимаюсь разработкой библиотеки, которая не может использовать классы. У меня есть функция, которую я вызываю при получении события KeyDown, и я хочу вызвать функцию, для которой я предварительно установил прототип в библиотеке. Дело в том, что я не хочу, чтобы пользователь определял эту функцию в обязательном порядке, если он не хочет обрабатывать ввод данных. Но компоновщик не позволит мне определить прототип без определения или установить пустое определение по умолчанию. Что я могу сделать? Кстати, я использую C ++ ...

Это прототипы /

void keyDown(int virtual_keyCode);
void keyUp(int virtual_keyCode);

1 Ответ

0 голосов
/ 06 ноября 2019

Переопределение функции невозможно в C ++. Прочитайте this о правиле единого определения.

Допускается только одно определение любой переменной, функции, типа класса, типа перечисления, концепции (начиная с C ++ 20) или шаблона. в любой единице перевода (некоторые из них могут иметь несколько объявлений, но допускается только одно определение).

Перегрузка функций класса возможна при наследовании. Перегрузка - это не то же самое, что переопределение.

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

#include<functional>
#include<iostream>

std::function<void(int)> keyUp = [](int) {};

void unused() {
    keyUp(2);
}

void KeyUp(int i) {
    std::cout << i << i << '\n';
}

int main() {
    unused(); // no print
    keyUp = [](int i) { std::cout << i << '\n'; };
    unused(); // prints 2
    keyUp = KeyUp;
    unused(); // prints 22
}

Это не выглядит одинаково, но фактически это то же самое .. .

...