C++ 改变C+中的函数实现+;

C++ 改变C+中的函数实现+;,c++,qt,C++,Qt,我使用Qt5.2。 在我的程序中,我想更改QString::toDouble(bool*ok)函数的标准实现。我写道: double QString::toDouble(bool *ok) const{ return QLocale().toDouble(this); } 当我使用选项-std=C++0x编译它时,它会出现下一个错误: 'QString::toDouble(bool*)const'的多重定义 我知道,我可以用Ruby这样的语言来做。我认为这种方式是很好的改变到双语言环境。请

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

double QString::toDouble(bool *ok) const{
  return QLocale().toDouble(this);
}
当我使用选项
-std=C++0x
编译它时,它会出现下一个错误:

'QString::toDouble(bool*)const'的多重定义

我知道,我可以用Ruby这样的语言来做。我认为这种方式是很好的改变到双语言环境。请纠正我,如果这是一个糟糕的编程风格或帮助实现这一点

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

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

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

这不是一种糟糕的编程风格。它只是C++中一个无效的构造。不能两次定义同一(成员)函数。可以在派生类中重新定义虚函数,但ut与定义同一函数两次不同


另一种方法是从QString类定义一个派生类,并在其内部定义一个具有相同签名的函数,该签名将隐藏类QString中的函数

这是一种不错的编程风格。它只是C++中一个无效的构造。不能两次定义同一(成员)函数。可以在派生类中重新定义虚函数,但ut与定义同一函数两次不同

另一种方法是从QString类定义一个派生类,并在其内部定义一个具有相同签名的函数,该签名将隐藏类QString中的函数

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

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

根据您的操作系统,您可以利用加载程序执行“函数挂钩”。在这里,加载程序允许您重新实现共享库的某些部分。有很多警告,这些地方不起作用,还有一些方法会微妙地导致难以调试的崩溃。我只包括完整的这些链接;您只需将代码转换为一个新函数:

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

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

根据您的操作系统,您可以利用加载程序执行“函数挂钩”。在这里,加载程序允许您重新实现共享库的某些部分。有很多警告,这些地方不起作用,还有一些方法会微妙地导致难以调试的崩溃。我只包括完整的这些链接;您只需将代码转换为一个新函数:


  • 在没有C++的情况下,我可以告诉你,C++中是不可能的。请在帖子中查新信息。你不能改变外籍函数的来源,而不能改变来源。子类QString将成为MyString并重新实现toDouble方法。一旦包含原始的QString实现,您将再次拥有两个具有相同封装外形的实现。@MagnusHoff虽然在绝大多数情况下它的风格不好,但在某些罕见的情况下它不是
    QString::toDouble
    可能是一个您没有源代码的外部文件。您也可能每天收到大量使用
    QString::toDouble
    的第三方源代码,但出于某种原因,您需要更改
    toDouble
    。在这种特定情况下,最好在运行时将
    更改为double
    。不幸的是,C++不支持这个。如果没有进入这是一个坏的风格(它是!),我可以告诉你,它是绝对不可能的C++。请检查新的信息在邮政。你不能改变功能的外国阶级,而不是改变其来源。子类QString将成为MyString并重新实现toDouble方法。一旦包含原始的QString实现,您将再次拥有两个具有相同封装外形的实现。@MagnusHoff虽然在绝大多数情况下它的风格不好,但在某些罕见的情况下它不是
    QString::toDouble
    可能是一个您没有源代码的外部文件。您也可能每天收到大量使用
    QString::toDouble
    的第三方源代码,但出于某种原因,您需要更改
    toDouble
    。在这种特定情况下,最好在运行时将
    更改为double
    。不幸的是,C++虽然不支持这个功能,但是编译器允许我改变静态函数。在函数定义开头的后插
    static
    中更新具有不同的含义。它的意思是“使此函数仅对该文件中的其他代码可见”。您可能无意中避免了在其他地方重新定义,但它不可能更改已编译的现有Qt库代码的行为。因此编译器查看我的函数,只是不寻找标准实现。但他(编译器)并没有向我保证,他会首先找到我的代码,对吗?“静态QString QString::number(double,char,int)”在没有dllimport属性的情况下重新声明:先前的dllimport忽略了[-Wattributes]QString QString::number(double n,char f,int prec)。只要你留在你的类中,这可能会工作,但任何其他调用可能会使用原来的函数。正如Tryke提到的,这可能导致不可预测的行为。这是一个如此简单的过程