Возможно ли, чтобы одна и та же функция-член имела разные определения для разных объектов этого класса?
ВАЖНОЕ ПРИМЕЧАНИЕ : я не могу использовать обратный вызов, как в это решение .(причина объяснена ниже в примере)
Допустим, у нас есть этот объект:
struct object
{
int n;
int m;
void f();
};
Возможно ли иметь что-то вроде:
object a,b;
// and here to define the functions
a.f() {std::cout << n+m;}
b.f() {std::cout << n-m;}
Причиная не могу использовать обратный вызов , потому что функция, которую я хочу определить, будет рекурсивной и будет переполнена.Что я пытаюсь сделать с помощью этого метода, так это создать имитацию стека (но все переменные хранятся в куче в виде списка с двойной цепью), и поэтому я буду вызывать функцию void (void)
, которая не имеет локальных переменных, таким образом увеличиваяглубина стека, которую может достичь функция.Также важно упомянуть, что я хочу сделать заголовочный файл с этой идеей.Для дальнейшего объяснения контекста, вот как это должно работать:
MyHeader.h
template <typename PARAM_TYPE> class HEAP_FUNCTION
{
private:
struct THIS_CALL // ! THIS HAS NOTHING TO DO WITH THE __thiscall CALLING CONVENTION !
{
PARAM_TYPE* PARAM;
THIS_CALL* next_call;
THIS_CALL* prev_call;
};
THIS_CALL* FIRST_CALL;
THIS_CALL* CURRENT_CALL;
public:
HEAP_FUNCTION(PARAM_TYPE* FirstCall)
{
FIRST_CALL = new THIS_CALL;
CURRENT_CALL = FIRST_CALL;
FIRST_CALL->PARAM = *FirstCall;
}
HEAP_FUNCTION(PARAM_TYPE FirstCall)
{
FIRST_CALL = new THIS_CALL;
CURRENT_CALL = FIRST_CALL;
FIRST_CALL->PARAM = FirstCall;
}
~HEAP_FUNCTION()
{
delete FIRST_CALL;
}
void call(void);
};
Source.cpp
// This is the ilustration of the recursive method for calculating
// the 1+2+3+...+n sum.
// The "normal" definition for this function would be:
//
// unsigned long long sum(unsigned long long n)
// {
// if (n == 0) return 0;
// return n + sum(n-1);
// }
//
// The function presented bellow is the equivalent.
struct Param
{
unsigned long long n;
unsigned long long return_value;
}
int main()
{
Param start_value;
start_value.n = 10; // we will calculate 1+2+...+10
HEAP_FUNCTION<Param> Gauss(&start_value);
// We imagine this is where i define call().
// The code written in this definiton works correctly.
Gauss.call()
{
// Test if the function needs to stop further calls.
if(CURRENT_CALL->PARAM->n == 0)
{
CURRENT_CALL->PARAM->return_value = 0;
return;
}
// Prepare the parameters for the next function call.
CURRENT_CALL->next_call = new THIS_CALL;
CURRENT_cALL->next_call->PARAM = new PARAM_TYPE;
CURRENT_CALL->next_call->prev_call = CURRENT_CALL;
CURRENT_CALL->next_call->PARAM->n = CURRENT_CALL->PARAM->n - 1;
// Call the next instance of the function.
CURRENT_CALL = CURRENT_CALL->next_call;
call();
CURRENT_CALL = CURRENT_CALL->prev_call;
// Collect the return value of the callee.
CURRENT_CALL->PARAM->return_value = CURRENT_CALL->PARAM->n + CURRENT_CALL->next_call->PARAM->return_value;
// Delete the space used by the callee.
delete CURRENT_CALL->next_call;
}
// This is the actual call of the function.
Gauss.call();
// The return value is found in the start_value struct.
std::cout << start_value.return_value << std::endl;
return 0;
}
ВАЖНОЕ ПРИМЕЧАНИЕ : Вывод всего класса приведет к единственному определению call()
для таких функций, как sum(a, b)
и dif(a, b)
, поскольку они будут использовать одну и ту же структуру PARAM
.(Даже если они не являются рекурсивными, и вероятность того, что кто-то использует это, очень мала, этот метод хорош в больших программах, когда некоторые из ваших функций будут иметь много параметров, и простое размещение их в куче приведет к большему количеству стеков.пространство) * * 1036