我使用Qt 5.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);
}
这也是一种糟糕的编程风格吗?
答案 0 :(得分:6)
C ++(和C)不支持Ruby风格的“猴子修补”,因为函数在编译时绑定在一起,而不是在运行时。 Qt的其余部分已经与旧版double QString::toDouble(bool)
相关联。
(Objective-C,它使用动态调度进行函数调用,就像Smalltalk和Ruby一样,实际上通过“Method Swizzling”来支持它。)
根据您的操作系统,您可以利用加载程序执行“功能挂钩”。这是加载程序允许您重新实现共享库的一部分的地方。有很多警告,这个地方不起作用,以及巧妙地导致难以调试的崩溃的方法。我只包括这些链接的完整性;你应该把你的代码变成一个新函数:
答案 1 :(得分:3)
这不是一个糟糕的编程风格。它只是C ++中的一个无效结构。您可能无法两次定义相同的(成员)函数。您可以在派生类中重新定义虚函数,但ut与定义相同函数两次不同。
另一种方法是从QString类定义派生类,并在其中定义一个具有相同签名的函数,该函数将隐藏类QString中的函数。