Separazione dell'implementazione di una classe dalla sua interfaccia ERRORE DI COMPILAZIONE

di il
10 risposte

Separazione dell'implementazione di una classe dalla sua interfaccia ERRORE DI COMPILAZIONE

Ciao a tutti,

Mi trovo nei problemi con la compilazione della mia prima classe divisa in 2; File .H di interfaccia e File .cpp di implementazione, potete darmi una mano a capire cosa non va?
Come IDE sto usando Dev-C++
l'IDE in fase di compilazione del main mi da questo Log:


Compiling single file...
--------
- Filename: C:\Users\Utente\Documents\File prigrammazione C++\Separazione classe da interfazzia da mai\fig03_13.cpp
- Compiler Name: TDM-GCC 4.9.2 64-bit Release

Processing C++ source file...
--------
- C++ Compiler: %BinDir0%\g++.exe
- Command: g++.exe "C:\Users\Utente\Documents\File prigrammazione C++\Separazione classe da interfazzia da mai\fig03_13.cpp" -o "C:\Users\Utente\Documents\File prigrammazione C++\Separazione classe da interfazzia da mai\fig03_13.exe" -I"%CppIncludeDir0%" -I"%CppIncludeDir1%" -I"%CppIncludeDir2%" -I"%CppIncludeDir2%\c++" -L"%LibDir0%" -L"%LibDir1%" -static-libgcc
C:\Users\Utente\AppData\Local\Temp\ccuNYHSG.o:fig03_13.cpp:(.text+0x48): undefined reference to`GradeBook::GradeBook(std::string)'
C:\Users\Utente\AppData\Local\Temp\ccuNYHSG.o:fig03_13.cpp:(.text+0x96): undefined reference to `GradeBook::GradeBook(std::string)'
C:\Users\Utente\AppData\Local\Temp\ccuNYHSG.o:fig03_13.cpp:(.text+0xbe): undefined reference to `GradeBook::getCourseName()'
C:\Users\Utente\AppData\Local\Temp\ccuNYHSG.o:fig03_13.cpp:(.text+0xfc): undefined reference to `GradeBook::getCourseName()'
collect2.exe: error: ld returned 1 exit status


Compilation results...
--------
- Errors: 1
- Warnings: 0
- Compilation Time: 1,23s


come messaggi nella lista errori invece mi da questo:


C:\Users\Utente\AppData\Local\Temp\ccuNYHSG.o fig03_13.cpp:(.text+0x48): undefined reference to `GradeBook::GradeBook(std::string)'
C:\Users\Utente\AppData\Local\Temp\ccuNYHSG.o fig03_13.cpp:(.text+0x96): undefined reference to `GradeBook::GradeBook(std::string)'
C:\Users\Utente\AppData\Local\Temp\ccuNYHSG.o fig03_13.cpp:(.text+0xbe): undefined reference to `GradeBook::getCourseName()'
C:\Users\Utente\AppData\Local\Temp\ccuNYHSG.o fig03_13.cpp:(.text+0xfc): undefined reference to `GradeBook::getCourseName()'


C:\Users\Utente\Documents\File prigrammazione C++\Separazione classe da interfazzia da mai\collect2.exe [Error] ld returned 1 exit status



Quando invece compilo il file .cpp come Log mi da


Compiling single file...
--------
- Filename: C:\Users\Utente\Documents\File prigrammazione C++\Separazione classe da interfazzia da mai\GradeBook.cpp
- Compiler Name: TDM-GCC 4.9.2 64-bit Release

Processing C++ source file...
--------
- C++ Compiler: %BinDir0%\g++.exe
- Command: g++.exe "C:\Users\Utente\Documents\File prigrammazione C++\Separazione classe da interfazzia da mai\GradeBook.cpp" -o "C:\Users\Utente\Documents\File prigrammazione C++\Separazione classe da interfazzia da mai\GradeBook.exe" -I"%CppIncludeDir0%" -I"%CppIncludeDir1%" -I"%CppIncludeDir2%" -I"%CppIncludeDir2%\c++" -L"%LibDir0%" -L"%LibDir1%" -static-libgcc
%LibDir1%\libmingw32.a(lib64_libmingw32_a-crt0_c.o): In function `main':
C:\crossdev\src\mingw-w64-v3-git\mingw-w64-crt\crt\crt0_c.c:18: undefined reference to `WinMain'
collect2.exe: error: ld returned 1 exit status


Compilation results...
--------
- Errors: 1
- Warnings: 0
- Compilation Time: 1,53s


e come errore :


C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib\libmingw32.a(lib64_libmingw32_a-crt0_c.o) In function `main':
18 C:\crossdev\src\mingw-w64-v3-git\mingw-w64-crt\crt\crt0_c.c undefined reference to `WinMain'


C:\Users\Utente\Documents\File prigrammazione C++\Separazione classe da interfazzia da mai\collect2.exe [Error] ld returned 1 exit status



Incollo di seguito anche il codice:

MAIN


/*fig3.13; fig03_13.cpp
verifica della classe GradeBook dopo la separazione della
sua interfaccia dall'implementazione*/
#include <iostream>
using std::cout;
using std::endl;

#include "GradeBook.h" //inclusione della definizione della classe GradeBook

//La funzione main inizia l'esecuzione del programma
int main()
{
	// Creazione di 2 oggetti GradeBook
	GradeBook gradeBook1 ("CS101 Introdation to C++ programming");
	GradeBook gradeBook2 ("CS102 Data structures in C++");
	
	//visualizza il nome iniziale del corso per ogni oggetto GradeBook
	cout << "gradeBook1 created for course: " << gradeBook1.getCourseName();
	cout << "\ngradeBook2 created for course: " << gradeBook2.getCourseName()
	<< endl<< endl;
	
	return 0;
}
}
Codice GradeBook.h


/* Fig 3.9 GradeBook.h
Definizione della classe gradeBook. Questo file presenta l'interfaccia 
pubblica della classe GRadeBook senza rilevare l'implementazione delle 
funzioni membro che sono definite nel file GradeBook.cpp*/

#include <string>	// La classe grade book utilizza la classe standard string
using std::string;
// definizione della classe GradeBook
class GradeBook
{
	public:
		GradeBook(string);// Costruttore che inizializza courseName
		void setCourseName (string);//funzione per implementare il nome del corso
		string getCourseName();//funzione per leggere il nome del corso
		void displayMessage();	// funzione che visualizza un messaggio
										// di benvenuto
	private:
		string courseName;	//nome del corso per questo corso
}; //fine della classe GradeBook
	
	
Codice GradeBook.cpp

/*fig3.12; fig03_12.cpp
Definizione delle funzioni membro della classe GradeBook. Questo file
contiene le implementazioni delle funzioni memebro i cui prototipi 
sono deiniti in Gradebook.h*/

#include<iostream>
using std::cout;
using std::endl;

#include "GradeBook.h"//inclusione dellla definizione della classe GradeBook

//il costrutto inizializza courseName con la stringa fornita come argomento
GradeBook::GradeBook(string name)
{
	setCourseName(name);                //chiamata alla funzione set per inizializzare
							  //courseName
}     // fine del costruttore

void GradeBook::setCourseName(string name)
{
	courseName = name;                  //memorizza il nome del corso nell'oggetto
}      //fine della funzione setCourseName

string GradeBook::getCourseName()
{
	return courseName;                 // restituisce il dato membro courseNome dell'oggetto
} // fine della funzione getCourseName

// visualizza un messaggio di benvenuto all'utente della classe GRadeBook
void GradeBook::displayMessage()
{
	//richiama getCourseName per leggere il nome del corso
	cout << "Welcome to the grade book for: "<<getCourseName()<<"!\n"<<endl;
}// fine della funzione displayMessage

10 Risposte

  • Re: Separazione dell'implementazione di una classe dalla sua interfaccia ERRORE DI COMPILAZIONE

    Diciamo che i problemi che rilevi hanno un senso:

    stai facendo

    - "prigrammazione e NON "programmazione"
    - su una "interfazzia" e NON su una "interfaccia"

    Ti sta' dicendo:

    ""BISCHERO"" stai usando delle funzionalita' DI CUI IO, ""compilatore"" NON NE SO NULLA. SO SOLO che esitono, ma non ho idea di dove andare a pescarle.

    Se vuoi e' come quando una bella ragazza ti dice: ""chiamami"" !!

    FANTASTICO!!!

    MA ... non ti ha dato il numero di telefono!!!
  • Re: Separazione dell'implementazione di una classe dalla sua interfaccia ERRORE DI COMPILAZIONE

    Perfetto, e sino qui direi che siamo d'accordo, manca qualcosa.
    A parte gli errori di battitura nei nomi delle cartelle che non interferiscono in alcun modo, il problema è che questo codice è copiato pari pari da un libro ma non funziona



    il problema è del linker.
    Il libro dichiara che una classe con interfaccia dovrebbe essere compilabile da sola e che al programmatore sviluppatore del main basta l'interfaccia, è poi il linker che collega tutto.
    Il codice è l'ho passato più volte e a parte refusi non vedo altre inesattezze tra i testi.
    Come collego il GradeBook.cpp col GradeBook.h?
    Il problema è sicuramente tra quei due perché quando includo l'implementazione nel .h tutto gira correttamente.

    Grazie
  • Re: Separazione dell'implementazione di una classe dalla sua interfaccia ERRORE DI COMPILAZIONE

    Il tutto funziona regolarmente ... (a parte una parentesi chiusa in più alla fine del main, errore di copia-incolla probabilmente).

    Come hai creato il progetto su Dev?
  • Re: Separazione dell'implementazione di una classe dalla sua interfaccia ERRORE DI COMPILAZIONE

    Oregon buongiorno,

    La parentesi in più nell'originale non c'è, si probabilmente un errore di copia ed incolla.
    Il libro mi spiega che il compilatore va a cercare i file header in primis nella cartella in cui è salvato il file del main.
    Quindi ho fatto 3 file sorgente e ne ho salvato uno con estensione .h e gli altri 2, implementazione classe e main, con estenìsione .cpp

    Quello che non riesco a capire e su cui ho qualche dubbio è il collegamento tra il main e l'implementazione della classe.
    Se la classe si attiva solo quando chiamata in causa non dovrebbe esserci un collegamento dal file.h al file.cpp?
    In questo modo sembra unidirezionale, come se ciclicamente la classe dovesse verificare che non ci siano dati passati all'interfaccia da parte del main.
    Inoltre non capisco se devo compilare la classe a parte o se tutto questo processo è automatico.
    allego spiegazione.
    Allegati:
    28286_69f1a60774e804cc6627f553b8775626.png
    28286_69f1a60774e804cc6627f553b8775626.png

    28286_77f20a6454cd04b20179379e132f211c.png
    28286_77f20a6454cd04b20179379e132f211c.png

    28286_e85bdeec37be29c3b3cf3e15bc24d411.png
    28286_e85bdeec37be29c3b3cf3e15bc24d411.png
  • Re: Separazione dell'implementazione di una classe dalla sua interfaccia ERRORE DI COMPILAZIONE

    Non hai letto quello che ti ho scritto e non mi hai risposto.

    Con Dev come hai creato il progetto?
  • Re: Separazione dell'implementazione di una classe dalla sua interfaccia ERRORE DI COMPILAZIONE

    Rik8 ha scritto:



    Il libro mi spiega che il compilatore va a cercare i file header in primis nella cartella in cui è salvato il file del main.
    Quindi ho fatto 3 file sorgente e ne ho salvato uno con estensione .h e gli altri 2, implementazione classe e main, con estenìsione .cpp
    Non ho creato un progetto, ho fatto 3 file sorgente diversi raggruppati in un'unica cartella.

    Sinché implemento e dichiaro la classe tutta in un file.h il main la legge.
    Ora che ho 2 .cpp mi da problemi.
  • Re: Separazione dell'implementazione di una classe dalla sua interfaccia ERRORE DI COMPILAZIONE

    E questo è il tuo errore.

    Devi creare un progetto

    New ... Project ... Console Application

    poi aggiungi i tuoi file al progetto e compili. Il linker prenderà tutti gli oggetti e creerà un solo exe.
  • Re: Separazione dell'implementazione di una classe dalla sua interfaccia ERRORE DI COMPILAZIONE

    Ma sei un GRANDEEEEEE Oregon...grazie mille.....

    Io stavo diventando tubercoloso a guardare il codice e poi era un problema di settaggio del lavoro... Grazie...

    Ti chiedo una cosa ulteriore già che siamo in tema:
    Posso anche compilare solo una classe senza il main?
    Se avessi intenzione di passare una classe ad un collega senza dagli il sorgente è possibile in questo modo?
  • Re: Separazione dell'implementazione di una classe dalla sua interfaccia ERRORE DI COMPILAZIONE

    Dovresti creare una libreria e fornirla insieme all'include
  • Re: Separazione dell'implementazione di una classe dalla sua interfaccia ERRORE DI COMPILAZIONE

    Lo terrò a mente appena sarò in grado di scrivere un pò di codice in più.

    Grazie ancora Oregon
Devi accedere o registrarti per scrivere nel forum
10 risposte