実際の関数名を同じに保ちながら、古いCスタイルの関数の周りにオブジェクト指向のラッパーを記述したいと思います。 void doStuff(int a, float b)
は古い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;
}
:例を見てみましょう。私の実際のコードでは、それと同等のものが外部のライブラリ/ヘッダーファイルにあるので、名前を変更することはできません。次に、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
機能の名前を変更せずにこのコードを動作させることはできますか?私がすでに考えていた1つの選択肢は、ある種の名前空間によって囲まれたvoid doStuff(int a, float b)
です。これは機能しますが、私にとっては非常に悪い練習のようです。
マイコンパイラはmingw-w64で、g ++ 5.2.0であるため、C++ 11とC++ 14が利用できます。