Наличие одной и той же функции-члена имеет разные определения для разных экземпляров классов - PullRequest
0 голосов
/ 18 ноября 2018

Возможно ли, чтобы одна и та же функция-член имела разные определения для разных объектов этого класса?

ВАЖНОЕ ПРИМЕЧАНИЕ : я не могу использовать обратный вызов, как в это решение .(причина объяснена ниже в примере)

Допустим, у нас есть этот объект:

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

1 Ответ

0 голосов
/ 18 ноября 2018

Не думаю, что я правильно понял вопрос, но вы рассматривали перегрузку функций?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...