C ++ questo puntatore, argomento nascosto nelle chiamate di funzione

Ho una class di stack con membri e una funzione chiamata push.

class STACK { int data; public: void push(int x) { data=x; } } 

Cosa fa C ++ per convertire questa affermazione:

 s1.push(3); 

a

 s1.push(this,3); 

Fondamentalmente la mia domanda è cosa succede sotto il cofano per generare this puntatore e passarlo come argomento nascosto?

In realtà sto codificando in C. Il mio objective è di avere un programma il più vicino ansible a OOP. Per questo ho i puntatori di funzione come membri della struttura. Pertanto, voglio sapere se è ansible in qualche modo avere traccia di quale struttura ha chiamato la funzione (come un puntatore “this”). Non voglio fare qualcosa di simile: s1.push (& s1,3); perché batte il mio scopo.

È ansible convertire s1.push (3); a s1.push (& 1,3); tramite sostituzione MACRO

Cominciando dall’inizio! La dichiarazione:

 s1.push(3); 

NON è tradotto in:

  s1.push(this, 3); 

Ma per qualcosa di simile:

 STACK::push(&s1, 3); 

Dove STACK::push può essere trattato come globale / namespace o funzione statica sotto class / namespace STACK , il cui prototipo sarebbe:

 push(STACK const* pThis, int arg); 

this puntatore è sempre il primo argomento del metodo (funzione). Se il metodo ha zero argomenti, avrà comunque un argomento (il puntatore della class).

Non c’è magia

 s1.push(3); 

è solo syntax per

 STACK::push(&s1, 3); 
 this = &s1 

L’indirizzo di s1 è noto, quindi può essere passato a STACK :: push. È così semplice 🙂

C ++ non converte esattamente le istruzioni (perché C ++ è una specifica del linguaggio, e potresti implementare quella lingua in molti modi, anche – in modo un po ‘etico – con una popolazione di schiavi che lavora su carta: non hai bisogno di un computer, anche se ne vuoi uno , per avere C ++). Il compilatore (ad es. GCC) traduce l’istruzione in altre rappresentazioni di livello inferiore. Con GCC, sono le dichiarazioni Gimple e la rappresentazione di Gimple può essere esaminata, ad esempio con la sonda di MELT o -fdump-tree-gimple e altre opzioni (come -fdump-tree-all o -fdump-tree-ssa ecc …)

Sfortunatamente, devi specificare il puntatore esplicitamente o implicitamente in C.

Per C ++, è responsabilità del compilatore impostare this puntatore implicito come argomento per una funzione membro della class. Nel tuo codice, la funzione membro viene alterata come void STACK::push(STACK*, int) nella compilazione automaticamente dal compilatore, quindi, quando viene chiamata la funzione membro STACK::push , il compilatore imposterà l’indirizzo dell’object ( this ) come argomento (generalmente il primo) alla funzione membro STACK::push .

Nessun compilatore C offrirà le funzioni precedenti, quindi, è responsabilità dell’utente impostare il puntatore.

Dopo la modifica, la domanda riprende un altro problema: OOP in C. È difficile e non sicuro, ma è ansible implementarlo. Puoi guardare la libreria GObject, che fornisce il sistema degli oggetti in C. Immagino che faccia un uso pesante delle macro.