Newsgroup: it.comp.lang.c++
Titolo: Ereditarieta': scusate la mia ignoranza...

Salve, sono "abbastanza" niubbo in C++.
Sto' facendo degli "esperimenti" per vedere se ho appreso appieno le varie
nozioni che ho imparato leggendo qua' e la' su Web.
Sono arrivato a provare l'ereditarieta', ma sicuramente non ho capito qualcosa.
Allora, io creo una classe che deve gestire un dialogo (ma non credo abbia importanza
sapere il suo scopo :) )
***
class ModalDialog{
public:
 bool create(HINSTANCE,HWND,int);
 bool create(HINSTANCE,HWND,LPCTSTR);
protected:
 HWND hParentWindow;
 HWND hModalDialog;
 HINSTANCE hCurrInstance;
private:
 static ModalDialog *lpCurrent;
 static int WINAPI StaticModalDialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
 int ModalDialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
 virtual bool InitProcedure();
 virtual bool ExitProcedure();
 virtual void OnDlgCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
};
***
e descrivo tutti quanti i metodi. Compilo: Ok
Adesso faccio una classe che deve ereditare praticamente tutto quello che fa' la precedente:
***
class InsertDialog: public ModalDialog {
 friend LPSTR GetFileName(HINSTANCE,HWND);
protected:
 InsertDialog();
public:
 bool create(HINSTANCE,HWND,int);
 bool create(HINSTANCE,HWND,LPCTSTR);
 LPSTR ActiveDialog(HINSTANCE,HWND);
protected:
 HWND hParentWindow;
 HWND hModalDialog;
 HINSTANCE hCurrInstance;
private:
 static InsertDialog *lpCurrent;
 static int WINAPI StaticModalDialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
 int ModalDialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
 bool InitProcedure();
 bool ExitProcedure();
 void OnDlgCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
 void GetText();
 void SetText(LPSTR);
 bool Browse();
 LPSTR tNome;
};
***
e descrivo solo quello che non ho descritto in ModalDialog.
Adesso, in ActiveDialog c'e' una chiamata a create(HINSTANCE,HWND,LPCTSTR),
***
LPSTR InsertDialog::ActiveDialog(HINSTANCE hI, HWND hW){
 tNome=new char[MAX_PATH]; *tNome=0;
 create(hI,hW,MAKEINTRESOURCE(IDD_INSERT));
 return tNome;
}
***
che ho definito in ModalFrame e non ho ridefinito in InsertDialog (perche', penso io, questa verra' ereditata).
Il problema e' che il Linker mi dice che non trova questa create :/
***
error LNK2001: unresolved external symbol "public: bool __thiscall InsertDialog::create(struct HINSTANCE__ *,struct HWND__ *,char
const *)" (?create@InsertDialog@@QAE_NPAUHINSTANCE__@@PAUHWND__@@PBD@Z)
***
Come mai? Dove ho sbagliato (perche' sono sicuro di aver sbagliato qualcosa :/)
Grazie a tutti e scusatemi per la mia ignoranza...
Killer

Nel codice che hai postato, la create incriminata è stata dichiarata in
entrambe le classi. Quindi ne esistono due versioni distinte. Poi
bisogna vedere se le hai effettivamente definite da qualche parte.
Ovvero se ha scritto il relativo codice. Il linker ti dice di no. Quindi
i casi sono due: se vuoi effettivamente due versioni della funzione,
scrivi il codice di entrambe, se ne vuoi una sola, togli la
dichiarazione dell'altra.
-- 
Posted from 
adsl-21-135.38-151.net24.it
 [151.38.135.21] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Ovvero se ha scritto il relativo codice.
Scusa la mia ignoranza, ma non devo sempre indicare nella classe derivata
le funzioni della classe base che voglio usare? Cmq, in quella base, la "create"
e' stata definita.
Tu dici che non la dovrei inserire nella dichiarazione della classe derivata?
Provero :)
Grazie della risposta
Killer

Provero :)
funzionera :)
