Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286

    [C++] Inlining member functions

    codice:
    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:


    codice:
    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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    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:

    codice:
    // Data.h
    
    #pragma once
    
    class CData
    {
       private:
    	double x;
    
       public:
    	double Get(void) const;
    };

    codice:
    // Data.cpp
    
    #include "StdAfx.h"
    #include ".\data.h"
    
    inline 
    double CData::Get(void) const 
    {
    	return x;
    }
    codice:
    // 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.

  4. #4
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    il file data.h è in posizione esatta? nell'include è indicato ".\data.h", probabilmente è in un'altra posizione

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Le funzioni inline vanno scritte sempre nell'header file, altrimenti il compilatore non può espanderle nel momento in cui vengono usate.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    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

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    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.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.