Newsgroup: it.comp.lang.c++
Titolo: Primi passi ed errore incomprensibile

Salve a tutti sto cercando di fare qualcosina in C++ per prendere la 
mano. Ho creato un progetto con Visual Studio 2005, in pratica devo 
implementare i metodi di una classe astratta di cui ho questo .h:
//CRubrica.h
class CRubrica{
public:
	virtual void AggiungiContatto(char* nome,char* numero) = 0;
	virtual void CancellaContatto(char* nome) = 0;
	virtual void CancellaRubrica(void) = 0;
	virtual void CaricaRubrica(char* nomefile) = 0;
	/* Ritorna TRUE se viene trovato un contatto che soddisfa la ricerca,
	 * FALSE altrimenti.
	 * Uno dei due parametri puo' essere NULL a seconda del tipo di ricerca 
effettuata
	 * La funzione deve stampare a video i dettagli del contatto trovato o 
un messaggio
	 * di errore.
	 * */
	virtual bool CercaContatto(char* nome,char* numero) = 0;
	/* Questa funzione deve stampare a video i dettagli di tutti i contatti 
presenti
	 * nella rubrica */
	virtual void StampaRubrica(void) = 0;
	virtual void SalvaRubrica(char* nomeFile) = 0;
 
};
Ora la mia classe deve ereditare questa ed il file .h è combinato in 
questa maniera:
//RubricaImpl.h
#pragma once
#include "c:\documents and settings\angelo\documenti\visual studio 
2005\projects\crubricaimpl\crubricaimpl\crubrica.h"
class CRubricaImpl :
	public CRubrica
{
public:
	CRubricaImpl(void);
	void AggiungiContatto(char* nome,char* numero);
	void CancellaContatto(char* nome);
	void CancellaRubrica(void);
	void CaricaRubrica(char* nomefile);
	bool CercaContatto(char* nome,char* numero);
	void StampaRubrica(void);
	void SalvaRubrica(char* nomeFile);
public:
	~CRubricaImpl(void);
};
Ora i miei dubbi sorgono adesso: Ho fatto bene a ridichiarare tutti i 
prototipi della superclasse nella sottoclasse evitando, ovviamente dal 
mio punto di vista, di definirli virtual?
Il file RubricaImpl.cpp definisce quei metodi (ancora sono vuoti però 
questo sarà lo scopo) in questo modo:
es:
void CRubricaImpl::AggiungiContatto(char* nome,char* numero){
;
}
Ora se provo a compilare il progetto, dove ancora non ho inserito 
nessuna linea di codice ma solo le strutture, diciamo così, mi viene 
dato questo errore che non comprendo:
------ Build started: Project: Primo, Configuration: Debug Win32 ------
Linking...
MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol 
_main referenced in function ___tmainCRTStartup
C:\Documents and Settings\angelo\Documenti\Visual Studio 
2005\Projects\Primo\Debug\Primo.exe : fatal error LNK1120: 1 unresolved 
externals
Build log was saved at "file://c:\Documents and 
Settings\angelo\Documenti\Visual Studio 
2005\Projects\Primo\Primo\Debug\BuildLog.htm"
Primo - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Che vuole dire? Io non ho scritto nulla di particolare, ho solo definito 
i prototipi e nella classe cpp ho scritto le funzioni (ancora vuote al 
loro interno, non vado avanti fino a quando non risolvo questo problema).
Cosa mi indica l'errore=
Cosa devo fare?
Grazie, ciao ciao.

 Cosa devo fare?
E' un errore del linker, che dice che non trova la funzione main.
Anche se sono solo dichiarazioni di strutture, il tuo programma deve 
sempre avere la funzione main, anche se vuota.
ciao
Giacomo

Giacomo Degli Esposti ha scritto:

Grazie mille, finalmente compila. Per quanto riguarda il prototipo della 
classe derivata, nella sottoclasse ho riscritto i metodi astratti della 
superclasse come non virtual, questa operazione andava fatta? Oppure non 
li dovevo dichiarare e dovevo semplicemente implementarli e basta?
Grazie, ciao ciao.

 superclasse come non virtual, questa operazione andava fatta?
Una funzione membro virtual (pura o meno) va dichiarata nella classe 
derivata se (1) si desidera implementarla, oppure (2) si desidera renderla 
pura. In questi casi la specificazione 'virtual' è opzionale. 
Ometterla (o metterla) non ha alcun effetto.
(Tanto per essere un po' pignoli: "metodo astratto" non è un'espressione 
terminologicamente corretta. In C++ ci sono le "funzioni membro", che 
possono essere dichiarate 'virtual' ed essere "pure" (=0). "Astratto" è una 
proprietà delle classi: una classe è astratta se possiede almeno una 
funzione virtual pura.)
Max

Max M. ha scritto:

Sulla terminologia perdonami, ho programmato spesso in Java e tendo ad 
adoperare spesso quei termini.
Invece volevo chiederti un'altra cosa. Ho scritto due funzioni una che 
prende una lista e la scrive su un file, ed una che prende dati da un 
file e li inserisce in una lista.
Ora se non ho letto male queste operazioni non lanciano eccezioni e devo 
essere io a gestire manualmente gli errori controllando degli 
indicatori. Come posso gestire gli errori? Quali sono gli indicatori e 
come posso accedervi?
Per esempio in questa funzione, che legge da file ed inserisce la 
stringa in una lista:
void FileAp(char *nomefile){
	ifstream fin;
	fin.open(nomefile);//qua come verifico che il file sia stato aperto?
 
	char pippo[60];
	while(fin.getline(pippo,60)){//sul getline devo fare qualche contollo?
		lista.push_back(pippo);
	}
	fin.close();//Qua devo fare qualche controllo?
}
Sulla open della funzione in cui scrivo sul file (se il file non c'è lo 
creo) che controllo devo fare? Simile a quello della open per aprire un 
file che deve esistere? Per ogni scrittura devo fare un controllo?
Grazie, ciao ciao.


per controllare se il file è stato aperto puoi utilizzare la funzione membro 
di fstream che è fin.is_open() che restituisce true se il file e stato 
aperto. Penso che esista ,ma non ne sono sicuro, anche una funzione simile 
per controllare la chiusura del file tipo fin.is_close(). per quanto 
riguarda il getline non ci sono controlli da fare perché semplicemente 
prende una alla volta le righe dal file finche non arriva alla fine.