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