2016-08-05 1 views
-1

まず、thisの質問が明確に私の疑いを説明していないことを明らかにする。コンテキストをクリアにする。私はC/C++の関数ポインタに関してこの問題を特に尋ねています。レイトバインディングのメリットは何ですか? C++の関数ポインタの文脈で一つの例を挙げよう

私は初期バインディングとレイトバインドの違いとその動作を知っています。私が理解したいことはC/C++で関数ポインタを使用した一例で、次のされています。多くの教科書に

、それは言及されています:遅延バインディングの

利点は、それがより柔軟であるということですどの関数を呼び出すかについての決定は、実行時まで にする必要はないため、早めに バインドを実行してください。

また、それは言及:遅延バインディングで

は、プログラムが ポインタに保持されているアドレスを読み、そのアドレスにジャンプすることがあります。これには1つの余分なステップが含まれ、 はわずかに遅くなります。ここ

#include <iostream> 
using namespace std; 

int Add(int nX, int nY) 
{ 
    return nX + nY; 
} 

int Subtract(int nX, int nY) 
{ 
    return nX - nY; 
} 

int Multiply(int nX, int nY) 
{ 
    return nX * nY; 
} 

int main() 
{ 
    int nX; 
    cout << "Enter a number: "; 
    cin >> nX; 

    int nY; 
    cout << "Enter another number: "; 
    cin >> nY; 

    int nOperation; 
    do 
    { 
     cout << "Enter an operation (0=add, 1=subtract, 2=multiply): "; 
     cin >> nOperation; 
    } while (nOperation < 0 || nOperation > 2); 

    // Create a function pointer named pFcn (yes, the syntax is ugly) 
    int (*pFcn)(int, int); 

    // Set pFcn to point to the function the user chose 
    switch (nOperation) 
    { 
     case 0: pFcn = Add; break; 
     case 1: pFcn = Subtract; break; 
     case 2: pFcn = Multiply; break; 
    } 

    // Call the function that pFcn is pointing to with nX and nY as parameters 
    cout << "The answer is: " << pFcn(nX, nY) << endl; 

    return 0; 
} 

、好まれるべき以下の例のように、遅延バインディングと事前バインディングを使用する利点はありません。

int nResult = 0; 
switch (nOperation) 
{ 
    case 0: nResult = Add(nX, nY); break; 
    case 1: nResult = Subtract(nX, nY); break; 
    case 2: nResult = Multiply(nX, nY); break; 
} 

cout << "The answer is: " << nResult << endl; 

誰かがのような遅延バインディングが有利、なぜ誰かが事前バインディングそれを上に選ぶべきであるところの下に簡単な例を挙げて説明してもらえますか?

+3

実行時にプラグインを追加する例が1つあります。Word文書にExcelスプレッドシートを埋め込み、それをWordから編集できるのはどうですか?実際には、ドキュメントフォーマットやそれを編集するアプリケーションを作成することができ、Wordはプログラムに遅くバインドすることができ、ユーザーはそれを使用することができます。これらは、レイトバインディングの例です。利点があるかどうかは、あなた次第です。 –

+1

私は特にC/C++ **のw.r.t **関数ポインタを求めています。誰かが保留を解除して答えてもらえますか? –

+1

レイトバインディングは 'C/C++の関数ポインタ'に関係すると思いますか?そうではありません。たとえば、[Visual C++を使用してオートメーションでDocumentPropertiesにアクセスする方法](https://support.microsoft.com/en-us/kb/238393)を参照してください。これはlateバインディングを使用してMS Wordを自動化する 'C++ 'コードです。使用または必要とされる「関数ポインタ」はありません。 – dxiv

答えて

5

「初期バインディング対遅延バインディング」定義の質問全体をスキップして、「誰かがswitch文の代わりに関数ポインタを使用するのはなぜですか?」と尋ねるふりをします。

機能ポインタがより柔軟であるためです。彼らは静的ではありません。のは、あなたのコードのビジネスの終わりを見てみましょう:素晴らしく、機能的だ

int InvokeOperation(int nOperation, int nX, int nY) 
{ 
    switch (nOperation) 
    { 
     case 0: return Add(nX, nY); 
     case 1: return Subtract(nX, nY); 
     case 2: return Multiply(nX, nY); 
    } 
} 

を。しかし、フレキシブルではありません。どうして?呼び出し可能な関数はすべてInvokeOperationで定義されているため、新しい操作を追加する場合は、InvokeOperationを変更する必要があります。あなたはより多くの操作を追加したい場合は、単にfuncsに要素を挿入し、今

using Func = int(*)(int, int); 
struct Op{Func func; std::string name;}; 
std::vector<Func> funcs = 
{ 
    {&Add, "Add"}, 
    {&Subtract, "Subtract"}, 
    {&Multiply, "Multiply"}, 
}; 

int InvokeOperation(int nOperation, int nX, int nY) 
{ 
    return funcs[nOperation].func(nX, nY); 
} 

:あなたは関数ポインタを使用した場合

対照的に、あなたは操作のレジストリ全体を構築することができます。 InvokeOperationが一部のライブラリの一部であった場合、必ずしもそれを変更する権利はありません。静的バインディングを使用すると柔軟性のないシステムになります。それが何をサポートしているのですか常にをサポートしています。

動的バインディングでは、ライブラリを直接変更する権利があるかどうかにかかわらず、必要なものを追加できます。

関連する問題