PDA

Visualizza la versione completa : [C++] Inlining member functions


Paulin
16-10-2008, 13:54
class CData
{
private:
double x;

public:
double Get(void) const;
};

inline
double CData::Get(void) const
{
return x;
}

main
{
double dvar;
CData data;
dvar = data.Get();
}

Questo codice mi genera un errore del linker nel punto in cui viene chiamato l'accessor Get() all'interno della funzione main:


Main.obj : error LNK2019: unresolved external symbol "public: double __thiscall CPosit::GetPosit_X(void)const " (?GetPosit_X@CPosit@@QBENXZ) referenced in function _WinMain@16
Debug/Geometry.exe : fatal error LNK1120: 1 unresolved externals




Se invece definisco la funzione inline all'interno del corpo della classe il codice viene compilato correttamente:



class CData
{
private:
double x;

public:
inline double Get(void) const {return x;}
};

Allora mi chiedo, sono io che sto sbagliando qualcosa, o le funzioni membro inline possono essere definite solo nel corpo della classe ?

Sto compilando con Visual C++ 7.1

oregon
16-10-2008, 14:38
Veramente l'errore fa riferimento ad una classe

CPosit

e ad un metodo

GetPosit_X(void) const

Non postare un esempio (che peraltro a me funziona) fatto con un'altra classe, ma il reale codice.

Paulin
16-10-2008, 15:47
Si, hai ragione avevo riportato l'esempio per semplicità, ad ogni modo a me non funziona nemmeno l'esempio che ho compilato in questo modo:


// Data.h

#pragma once

class CData
{
private:
double x;

public:
double Get(void) const;
};



// Data.cpp

#include "StdAfx.h"
#include ".\data.h"

inline
double CData::Get(void) const
{
return x;
}


// Test.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include ".\data.h"

int _tmain(int argc, _TCHAR* argv[])
{
double dvar;
CData data;
dvar = data.Get();

return 0;
}



Linking...
Test.obj : error LNK2019: unresolved external symbol "public: double __thiscall CData::Get(void)const " (?Get@CData@@QBENXZ) referenced in function _main
Debug/Test.exe : fatal error LNK1120: 1 unresolved externals
L'errore è sempre lo stesso.
Mi resta da capire perché a te compila e a me no.

Rimango in attesa di qualche suggerimento.

Stoicenko
16-10-2008, 17:54
il file data.h è in posizione esatta? nell'include è indicato ".\data.h", probabilmente è in un'altra posizione

shodan
16-10-2008, 19:53
Le funzioni inline vanno scritte sempre nell'header file, altrimenti il compilatore non può espanderle nel momento in cui vengono usate.

Paulin
16-10-2008, 20:01
Originariamente inviato da Stoicenko
il file data.h è in posizione esatta? nell'include è indicato ".\data.h", probabilmente è in un'altra posizione

I files sono tutti nulla stessa cartella assieme al progetto e anche scrivendo #include "data.h" il risultato non cambia.

Mi viene quasi il dubbio che possa dipendere dalle specifiche del compilatore VC++ 7

Paulin
16-10-2008, 20:05
Originariamente inviato da shodan
Le funzioni inline vanno scritte sempre nell'header file, altrimenti il compilatore non può espanderle nel momento in cui vengono usate.

Scusa shodan, non avevo visto la tua risposta. Allora tu mi confermi che quello che avevo sospettato, ma di cui non ero sicuro.

oregon
16-10-2008, 20:14
E' come ti ha detto shodan ... in alternativa (e per questo ha funzionato nei miei test), puoi avere il file data.h e il corpo della funzione la scrivi in Test.cpp prima del main.

Paulin
17-10-2008, 02:12
Originariamente inviato da oregon
E' come ti ha detto shodan ... in alternativa (e per questo ha funzionato nei miei test), puoi avere il file data.h e il corpo della funzione la scrivi in Test.cpp prima del main.

Si, è vero, ho provato. Allora allo stesso modo funziona anche il codice che ho postato in precedenza, sempre che nel file Test.cpp si includa il file di implementazione della classe Data.cpp anziché la sua interfaccia Data.h, e a questo non c'avevo proprio pensato.

Non so però se questa soluzione possa rappresentare una corretta pratica di programmazione, o se per qualche motivo sia sempre e comunque preferibile scrivere le funzioni "inline" nel corpo della classe.

Loading