Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ereditarietà di funzione inline
Forum - C/C++ - Ereditarietà di funzione inline

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 13:33
Domenica, 15/11/2015
Salve. inline è uno dei tanti modificatori del CPP ed essendo uno dei piu "sfigati" la documentazione che lo riguardano è scarsa.
Vorrei sapere, avendo una classe base esiste un metodo per richiamare una funzione dichiarata come tale in una classe figlia?
Grazie.

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 18:23
Domenica, 15/11/2015
L'eredità dei metodi funziona allo stesso modo che ci sia inline o meno.
Se la tua domanda è
Codice sorgente - presumibilmente Plain Text

  1. a.metodo_inline();


Viene messo inlined? A seconda di cosa decide il compilatore, in genere sì.
Nel caso invece
Codice sorgente - presumibilmente C/C++

  1. Base* b = new Figlia;
  2. b->metodoInline();


Qua, dipende. In questo caso probabilmente sì, a meno che il compilatore non sia scemo. Ma se ad esempio ho un array di valori Base* e li passo a una funzione che chiama quel metodo, allora no (perché a priori non sai se siano tutti Figlia)

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 22:32
Domenica, 15/11/2015
Faccio un esempio, premetto che compilo con GCC.
Ho una classe base che implementa il metodo A inline, dall'interno della classe questa si riesce a richiamare tranquillamente.
Da una classe figlio1 che eredita da base se cerco di richiamare A ricevo l'errore di mancata implementazione.

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 20:33
Lunedì, 16/11/2015
Testo quotato

Postato originariamente da Roby94:

Faccio un esempio, premetto che compilo con GCC.
Ho una classe base che implementa il metodo A inline, dall'interno della classe questa si riesce a richiamare tranquillamente.
Da una classe figlio1 che eredita da base se cerco di richiamare A ricevo l'errore di mancata implementazione.  


Devi fare in modo che il metodo A sia almeno protected

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 21:18
Lunedì, 16/11/2015
è protected.

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 22:33
Lunedì, 16/11/2015
Testo quotato

Postato originariamente da Roby94:

è protected.


Ma è una cosa di questo tipo o sto capendo male io?:
http://ideone.com/zhAE4S

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 17:04
Mercoledì, 18/11/2015
Si, solamente l'implementazione del metodo inline viene eseguita in un file cpp a parte... In ogni caso non riesco piu a riprodurre l'errore, chiedo scusa ma non ho idea di quale fosse il problema in principio.
In ogni caso ti ringrazio lumo e mi scuso ancora.

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 21:51
Venerdì, 20/11/2015
Sono riuscito a ricreare l'errore in condizioni leggermente diverse, e mi sta facendo leggermente impazzire.
Libreria A
a.h
Codice sorgente - presumibilmente C/C++

  1. namespace A {
  2.     void b();
  3. }


a.cpp
Codice sorgente - presumibilmente C/C++

  1. #include "a.h"
  2. inline void A::b() {
  3.     [...]
  4. }


Applicativo C
main.cpp
Codice sorgente - presumibilmente C/C++

  1. #include "../a/a.h"
  2. void main() {
  3.     A::b();
  4. }


In questo caso l'errore mi viene generato nell'applicativo
Codice sorgente - presumibilmente C/C++

  1. undefined reference to `A::b()'


In C questo stesso problema lo risolvo affiancando il marcatore extern al prototipo della funzione inline, e cosi risolvo.
Sapreste aiutarmi? Sono un po' bloccato, le ho provate quasi tutte.

Ultima modifica effettuata da Roby94 il 20/11/2015 alle 21:52
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 21:54
Venerdì, 20/11/2015
sì, è un errore di semantica, cambia così a.cpp

Codice sorgente - presumibilmente C++

  1. #include "a.h"
  2. namespace A {
  3. inline void b() { .. }
  4. }




PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo