PDA

View Full Version : Primi passi in c++, ereditarietà quesiti vari


Abdujaparov
21-09-2006, 22:18
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.

TempestaT400
21-09-2006, 22:23
credo che i problemi siano sugli include!
usando #include "xxx"
quando il parametro è tra apici, se non ricordo male, significa che il file header che si sta includendo fa parte del progetto e non del framework del compilatore.!.
prova a mettere solamente

#include "CRubrica.h"

Abdujaparov
22-09-2006, 07:20
Sono riuscito a risolvere, visual studio voleva una classe con il main, che nel mio progetto mancava.
Invece per quanto riguarda l'ereditarietà da una classe astratta, nel prototipo della sottoclasse ho ridichiarato i metodi che erano astratti, stavolta come non virtual e non =0. Questa operazione era necessaria? Potevo direttamente scrivere i metodi, con il loro relativo codice, senza dichiarali nuovamente nel file .h della sottoclasse?
Grazie, ciao ciao.

Ziosilvio
22-09-2006, 09:22
quando il parametro è tra apici, se non ricordo male, significa che il file header che si sta includendo fa parte del progetto e non del framework del compilatore
Più esattamente:
- se il nome dell'header è tra minore e maggiore, allora il path assoluto inizia nel modo predefinito, ad esempio con /usr/include ;
- se è tra doppi apici, inizia dalla cartella corrente.

Per esempio, se sei sotto Linux con un'installazione "standard" e la cartella del progetto è /home/tempesta/proganzo , allora '#include <stdio.h>' dice al compilatore di includere /usr/include/stdio.h , mentre '#include "attrezzi/attrezzi.h"' dice di includere /home/tempesta/proganzo/attrezzi/attrezzi.h .

TempestaT400
22-09-2006, 12:16
è da tanto che non tocco c++... ricordavo a larghi linee!!!
:D

giangian2
22-09-2006, 15:34
Invece per quanto riguarda l'ereditarietà da una classe astratta, nel prototipo della sottoclasse ho ridichiarato i metodi che erano astratti, stavolta come non virtual e non =0. Questa operazione era necessaria? Potevo direttamente scrivere i metodi, con il loro relativo codice, senza dichiarali nuovamente nel file .h della sottoclasse?
Grazie, ciao ciao.

Ciao,
la definizione corretta della "sottoclasse" e` "Classe derivata" ;) .
Per quanto riguarda la classe derivata e` corretto ridefinire nel file .h le funzioni virtuali, questa volta non astratte (quindi togliendo " = 0").
Sul fatto di ridichiarare le funzioni come "virtual" o meno, sulla classe derivata, a livello pratico non cambia niente, perche` se una funzione e` virtuale nella classe base lo e` anche su tutte le classi derivate. Io personalmente se una funzione e` dichiarata come virtuale nella classe base, la ridichiaro virtual anche i tutte le classi derivate, in modo da capire velocemente se tale funzione e` della classe base o una funzione dichiarata nella classe derivata.

ciaooo