【问题标题】:Function prototype, without definition函数原型,无定义
【发布时间】:2019-11-05 19:43:49
【问题描述】:

我正在开发一个不能使用类的库。我有一个函数,当我得到一个 KeyDown 事件时,我想调用一个函数,我之前在库中设置了原型。 问题是,如果用户不想处理任何输入,我不想强​​制用户定义此函数。但是链接器不会让我定义没有定义的原型或设置默认的空定义。我能做些什么? 顺便说一句,我正在使用 C++...

这是原型/

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

【问题讨论】:

  • 使用函数指针。或弱功能。
  • 为什么你不能使用类?这是一个……奇怪……要求。
  • fwiw,问题不在于没有定义的声明,而是您在代码中某处调用该函数而没有为其提供定义
  • 对弱功能感到好奇,发现this,似乎是解决您问题的可能方法
  • 我使用了一个弱引用,但是当我重新定义它时它仍然给我一个错误。

标签: c++ prototype definition


【解决方案1】:

在 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
}

看起来不一样,但实际上是一样的......

【讨论】:

    猜你喜欢
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 2015-11-08
    相关资源
    最近更新 更多