c++ - 在 C++ 中更改函数实现

标签 c++ qt

我使用 Qt 5.2。 在我的程序中,我想更改 QString::toDouble(bool *ok) 函数的标准实现。我写:

double QString::toDouble(bool *ok) const{
  return QLocale().toDouble(this);
}

当我使用选项 -std=C++0x 编译它时,会出现下一个错误:

Multiple definition of `QString::toDouble(bool*) const'

我知道,我可以用像 Ruby 这样的语言来做。我觉得这种方式换成Double locale还是挺不错的。如果这是一种糟糕的编程风格或有助于实现这一点,请纠正我。

更新 但是编译器允许我改变静态函数的实现

QString QString::number(double n, char f, int prec){
    return QLocale().toString(n, f, prec);
}

这也是一种糟糕的编程风格吗?

最佳答案

C++(和 C)不支持 Ruby 风格的“猴子补丁”,因为函数是在编译 时绑定(bind)在一起的,而不是在运行 时。 Qt 的其余部分已经链接到 double QString::toDouble(bool) 的旧版本。

(Objective-C 像 Smalltalk 和 Ruby 一样对函数调用使用动态调度,实际上确实通过“Method Swizzling”支持这一点。)

根据您的操作系统,您可以利用加载程序执行“函数 Hook ”。这是加载程序允许您重新实现共享库的一部分的地方。有很多注意事项,这不起作用的地方,以及巧妙地导致难以调试的崩溃的方法。为了完整起见,我只包含这些链接;你应该把你的代码变成一个新函数:

关于c++ - 在 C++ 中更改函数实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23629575/

相关文章:

c++ - 添加不同类型的数组 (c++)

c++ - 当对任何数字应用移位操作时。如何取回原始数字

两个 unordered_set 交集的 C++ 库方法

java - 在单独的 Android 线程上调用时,emit 不起作用

c++ - 如何在 Qt 中执行复杂的 linux 命令?

c++ - VS中的C6385警告(关于动态数组)

C++ 构造函数隐式返回类型

qt - 动态更改 QML 映射中 osm 插件的自定义主机 URL

c++ - 对 vtable 的 undefined reference ...

c++ - QTableWidget 项的内存管理