2016-01-25 5 views
5

Sto utilizzando una libreria statica di terze parti (file .lib) in un progetto C++. L'autore della libreria statica ha aggiunto un metodo a una classe per me e mi ha inviato una build aggiornata della libreria.L'ordine delle dichiarazioni dei metodi in una classe importa al compilatore?

Sfortunatamente, non ha inviato un nuovo file di intestazione e la comunicazione con lui è lenta, quindi potrei non ricevere presto la nuova intestazione. Conosco la firma del metodo del nuovo metodo, quindi potrei semplicemente aggiungerlo al file di intestazione.

La mia domanda è se importa dove nella lista dei metodi pubblici aggiungo la nuova dichiarazione (in alto, in basso, in mezzo ...). La mia ipotesi migliore è che sia e che l'ordine nel file di intestazione determini l'ordine nella classe compilata. Qualcuno può confermare o smentire questo?

+4

Possibile duplicato: http://stackoverflow.com/questions/19858914/does-the-function-declaration-order-matter-in-a-header-file – user2079303

+1

Si prega di dare un'occhiata a [questo stackoverflow] (http : //stackoverflow.com/questions/19858914/does-the-function-declaration-order-matter-in-a-header-file), che spiega tutto nei dettagli. – Derlin

+0

Grazie a tutti e due. La domanda a cui ti colleghi aiuta la mia comprensione. – adv12

risposta

11

La mia domanda è se è importante in cui nella lista dei metodi pubblici aggiungo la nuova dichiarazione

per quanto ne so, non importa se la funzione di membro è funzione regolare, ma è importante se si tratta di un virtual funzione membro. Le funzioni dei membri virtuali nella tabella virtuale sono in un determinato ordine. Se la libreria li ha in un ordine diverso da quello del tuo file .h, molto probabilmente finirai per chiamare la funzione sbagliata.

correlati: Force the order of functions in the virtual method table?

+0

Wow, non avevo pensato al problema con 'virtual's, ma sembra essere un rischio molto reale. I duplicati collegati sopra lo menzionano di passaggio, e il link di KDE sembra andare in profondità nelle ramificazioni da una prospettiva ABI. –

+0

Grazie per le informazioni. Nel mio caso, le funzioni non sono virtuali, quindi aggiungerò la nuova dichiarazione di metodo in fondo alla lista e spero che tu abbia ragione :) – adv12

+0

@ adv12, sono stato morso dall'ordine dei tavoli virtuali un lungo tempo fa, nei primi anni 2000. Se la funzione membro è una funzione membro normale, si dovrebbe essere ok. In bocca al lupo. –

0

Se la dichiarazione metodo non utilizza i tipi dichiarati nella classe come ad esempio il tipo di ritorno, allora è poco importante in cui viene dichiarato il metodo.

In caso contrario, se una dichiarazione del metodo dipende da dichiarazioni di altri tipi all'interno della classe, può verificarsi un errore.

Ad esempio il compilatore emetterà un errore per questa definizione di classe

struct A 
{ 
    B f(); 
    struct B {}; 
    //... 
}; 

perché tipo struct B viene utilizzato nella dichiarazione funzione membro f prima della dichiarazione struttura stessa.

+0

Grazie per le informazioni. Nel mio caso, la funzione è un 'void something (CString)' (classe stringa MFC) e non usa alcun tipo definito nell'intestazione. Quindi la mia preoccupazione era se mettere la dichiarazione del metodo nel posto "sbagliato" nella definizione della classe avrebbe reso così chiamato il metodo sbagliato. Ma ho dimenticato il linker.Sono più familiare con C#, dove questo tipo di domanda non viene fuori. – adv12

+0

@ adv12 In questo caso non ci sono problemi se la dichiarazione della funzione non dipende dalle dichiarazioni degli altri membri della classe. –

0

Le dichiarazioni di metodo in una classe non dovrebbero avere importanza per il compilatore, a meno che non dipendano da una dichiarazione di variabile che non è stata ancora eseguita.

Problemi correlati