2009-10-27 5 views
9

Va bene,Metodi in linea statici?

Qui è quello che sto cercando di fare ... In questo momento di compilare ma non riuscendo a collegare ... LNK2001

Voglio che i metodi statici perché non ci sono variabili membro, tuttavia Li voglio anche in linea per gli aumenti di velocità che forniscono.

Qual è il modo migliore per farlo? Ecco quello che ho in poche parole:

/* foo.h */ 
class foo 
{ 
    static void bar(float* in); 
}; 

/* foo.cpp */ 
inline void foo::bar(float* in) 
{ 
    // some dark magic here 
} 

che sto cercando di fare questo perché voglio essere in grado di andare:

foo::bar(myFloatPtr); 

pippo non ha variabili membro ... non ha senso.

+0

Inoltre, da un punto di vista della progettazione, sarebbe possibile utilizzare un riferimento a un float anziché a un puntatore? Di solito è preferito un riferimento. – GManNickG

+0

si, lo so ... ma in questo caso non riesco ad aggirare la dinamicità :) – Polaris878

+0

++ 1 Per "magia nera qui". – nahpr

risposta

10

Se si chiama bar da un altro file cpp, diverso da quello foo.cpp, ha bisogno di essere in un file di intestazione.

+1

grrrrr ha senso – Polaris878

3

È necessario definire la funzione inline nel file di intestazione, non un file di implementazione separato. Le definizioni sono necessarie quando il file di intestazione è #incluso, se si spera di essere in linea, dopo tutto.

L'errore di collegamento che si sta verificando è dovuto al fatto che la dichiarazione (nel file di intestazione) non informa il compilatore che il metodo deve essere in linea, mentre l'implementazione è in linea, quindi non disponibile per il collegamento.

5

In primo luogo, li inserirò in un namespace, perché non c'è alcuna logica in quello "class". In secondo luogo, è possibile definire direttamente il corpo delle funzioni nel file di intestazione per consentire al compilatore di vederle. In caso contrario, è necessario whole program optimization essere fatto dal linker per inlining quelle funzioni (AFAIK).

+0

Sì, probabilmente hai ragione riguardo al namespace ... Li avevo in classe perché avevano tutti funzionalità simili – Polaris878

1

funzioni Generalmente inline-grado sono implementate in cui sono dichiarate (nel file di intestazione). Il compilatore è libero di inline funzioni come li avete, ma non forza può a inline nulla. Se si utilizza Visual C++, abilitare "inline qualsiasi adatto", "generazione di codice link-time" e "favorire codice veloce".