Во-первых, позвольте мне пояснить это вопрос не объясняет ясно мое сомнение. Чтобы контекст был ясным. Я задаю этот вопрос конкретно в отношении указателей функций в C/C++.
Я знаю разницу между ранним связыванием и поздним связыванием и знаю, как это работает. Я хотел бы понять следующее с одним примером использования указателей функций в C/C++:
Во многих учебниках упоминается:
Преимущество позднего связывания заключается в том, что оно более гибкое, чем раннее связывание, поскольку решения о том, какую функцию вызывать, не нужно принимать до момента выполнения.
Также в нем упоминаются:
При позднем связывании программа должна прочитать адрес, содержащийся в указателе, и затем перейти к этому адресу. Это включает в себя один дополнительный шаг, что делает его немного медленнее.
#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;
Может ли кто-нибудь объяснить на простом примере, как показано ниже, где поздняя привязка выгодна и почему кто-то должен выбрать ее, а не раннюю привязку?
function pointers in C/C++
? Это не. См., например, Как использовать Visual C++ для доступа к DocumentProperties с помощью автоматизации — этоC++
код, автоматизирующий MS Word с использованием позднего связывания, иfunction pointer
не используется и не требуется. - person dxiv   schedule 06.08.2016in the context of using function pointers
. Например, позднее связывание в Windows OLE/COM сводится к IDispatch::GetIDsOfNames и IDispatch:: Вызов. Оба не используют указатели на функции, и я не знаю, как их объяснитьin the context of using function pointers
. Вам нужно будет лучше сформулировать свой вопрос (и, возможно, более узко), поскольку совсем не ясно, чего вы хотите. - person dxiv   schedule 06.08.2016late binding
. Возможно, вам следует упомянуть, чтоtextbooks
вы имеете в виду, так как я не думаю, что это слишком распространенное употребление. Что касается самого вопроса, предположим, что вы заменили задачу выполнить операцию над nX, nY и вернуть результат на округлить nX, nY до ближайших кратных 100, выполнить операцию, затем округлить результат до ближайшего кратного из 100. Попробуйте написать последний с указателем на функцию, а не без него — первый будет намного проще и понятнее. - person dxiv   schedule 06.08.2016