我想围绕旧的C风格函数编写面向对象的包装器,同时保持实际的函数名称相同。看一个例子:
#include <iostream>
void doStuff(int a, float b)
{
std::cout << "a = " << a << ", b = " << b << "\n";
}
class Stuff
{
private:
int a;
float b;
public:
Stuff(int newA, float newB) : a(newA), b(newB) { }
int getA() { return a; }
float getB() { return b; }
};
class Widget
{
public:
void doStuff(Stuff s)
{
doStuff(s.getA(), s.getB()); //error: no matching function for call to 'Widget::doStuff(int, float)'
}
};
int main()
{
Widget w;
w.doStuff(Stuff(42, 3.14f));
return 0;
}
在此示例中,void doStuff(int a, float b)
是旧的C函数。因为在我的实际代码中,它的等价物是在外部库/头文件中,我无法更改其名称。接下来,Stuff
是用于保持void doStuff(int a, float b)
值所需的容器。 Widget
中发生的重要事情:void Widget::doStuff(Stuff s)
应该是实际的包装器。我现在希望doStuff(s.getA(), s.getB())
调用旧的C风格函数void doStuff(int a, int b)
,但编译失败并出现给定错误。
是否可以在不更改两个doStuff
功能的名称的情况下使此代码正常工作?我已经想到的一个选项是通过某个命名空间围绕void doStuff(int a, float b)
。这有效,但对我来说似乎是非常糟糕的做法。
我的编译器是mingw-w64和g ++ 5.2.0,所以C ++ 11和C ++ 14可用。
答案 0 :(得分:4)
班级中的doStuff(Stuff s)
方法会隐藏全局函数doStuff(int a, float b)
。如果您要调用全局doStuff
函数,则必须使用范围解析运算符::
(::doStuff(s.getA(), s.getB());
)
答案 1 :(得分:0)
尝试按照以下方式拨打电话:
::doStuff(s.getA(), s.getB());