2016-03-22 8 views
0

実際の関数名を同じに保ちながら、古い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が利用できます。

答えて

4

あなたのクラスのdoStuff(Stuff s)メソッドはグローバル関数doStuff(int a, float b)を隠します。グローバルdoStuff関数を呼び出す場合は、スコープ解決演算子::::doStuff(s.getA(), s.getB());

を使用する必要があります
0

はこのようにあなたの電話を作ってみましょう:

::doStuff(s.getA(), s.getB()); 
関連する問題