不要在类中使用类成员函数

时间:2016-03-22 15:41:06

标签: c++ oop

我想围绕旧的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可用。

2 个答案:

答案 0 :(得分:4)

班级中的doStuff(Stuff s)方法会隐藏全局函数doStuff(int a, float b)。如果您要调用全局doStuff函数,则必须使用范围解析运算符::::doStuff(s.getA(), s.getB());

答案 1 :(得分:0)

尝试按照以下方式拨打电话:

::doStuff(s.getA(), s.getB());