2016-03-22 4 views
0

Я хочу написать объектно-ориентированную оболочку вокруг старых функций стиля 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.

ответ

4

Метод doStuff(Stuff s) в классе скрывает глобальную функцию doStuff(int a, float b). Если вы хотите вызвать глобальную функцию doStuff, вам необходимо использовать оператор разрешения области видимости :: (::doStuff(s.getA(), s.getB());)

0

Попробуйте сделать свой вызов, как это:

::doStuff(s.getA(), s.getB()); 
Смежные вопросы