Newsgroup: it.comp.lang.c++
Titolo: Classe base ereditata come PRIVATE: problema

Salve a tutti,
sto derivando una classe dalla classe CMap (delle MFC con il VC6) come
riportato qui (ho eliminato alcune funzioni membro superflue):
class CExpResMap : protected CMap<MY_STRUCT, MY_STRUCT&, int, int&>
{
public:
	CExpResMap() {};
	virtual ~CExpResMap() {};
	void Add(const CExpBase& rExp);
	void Release(const CExpBase& rExp);
	void ReleaseAll() { RemoveAll(); };
};
tutto funziona bene, ma se provo ad istanziare a runtime una istanza
della classe utilizzando:
m_pExternalExpRes = new CExpResMap();
il compilatore genera i seguenti 2 errori:
error C2247: 'new' not accessible because 'CMap<struct MY_STRUCT,struct
MY_STRUCT &,int,int &>' uses 'public' to inherit from 'CObject'
        see declaration of 'new'
error C2247: 'delete' not accessible because 'CMap<struct
MY_STRUCT,struct MY_STRUCT &,int,int &>' uses 'public' to inherit from
'CObject'
        see declaration of 'delete'
Se invece dichiaro la classe base come PUBLIC il codice viene compilato
correttamente, ma vorrei dichiararla almeno PROTECTED per nascondere
tutti i membri publici della CMap.
Questa cosa però rende inaccessibile anche l'operatore new e delete:
come posso fare? devo implementare il new e delete anche nella mia
classe come public? come? esisitono altre soluzioni? oppure sto
sbagliando qualcosa??
Spero di essere stato chiaro, altrimenti non esistate a farmi domande.
Grazie in anticipo a chi mi risponderà.
Ciao.

 class CExpResMap : protected CMap<MY_STRUCT, MY_STRUCT&, int, int&>
invece di usare ereditarieta' privata (protected in questo caso), ti
consiglio di avere la std::map come member object.
quindi invece di avere:
class Derived : private Base
{
};
avere:
class Derived
{
private:
   Base b_;
};
a questo punto se Base ha 2 funzioni membro:
- Foo() 
- Bar()
nel primo caso scrivevi:
void Derived::Func()
{
    Foo();
    Bar();
}
ora devi semplicemente scrivere:
void Derived::Func()
{
    b_.Foo();
    b_.Bar();
}
in generale si evita l'ereditarieta' privata e si opta per questa
soluzione. Vedi Exceptional/More exceptional C++ per sapere perche'.
Tommaso
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


Lo supponevo! Cos'e Exceptional/More exceptional C++?
Grazie x i consigli
Mirko

 Lo supponevo! Cos'e Exceptional/More exceptional C++?
Exceptional C++:
http://www.amazon.co.uk/Exceptional-C%2b%2b-Herb-Sutter/dp/0201615622/sr=8-1/qid=1159188212/ref=pd_ka_1/026-1832543-8698853?ie=UTF8&s=books
More Exceptional C++:
http://www.amazon.co.uk/More-Exceptional-C%2b%2b-Engineering-Programming/dp/020170434X/sr=8-2/qid=1159188212/ref=pd_ka_2/026-1832543-8698853?ie=UTF8&s=books
in particolare l'articolo a cui mi riferico e' su di uno dei due libri
ma lo puoi trovare piu' o meno uguale su gotw (guru of the week), sito
dell'autore dei due libri.
http://www.gotw.ca/publications/mill06.htm
che pone l'esempio di ereditare in modo privato da MyList (lista invece
che mappa) oppure di avere MyList come member object.
spiega vantaggi e svantaggi di entrambi i metodi e consiglia di
utilizzare il secondo nel caso dell'esempio.


 mi piacciono x niente le MFC ma mi tocca sopportare!
Il VC++ 6 e' un compilatore C++ molto datato e con parecchi problemi
(compie 10 anni fra poco!), quindi e' possibile cio' che dici.
Usando VC++ 2002, 2003 o 2005 non dovresti avere troppi problemi.
Altrimenti va benissimo anche un port grauito per windows del gcc tipo
mingw.
Ti consiglio inoltre di acquisire dimestichezza con la libreria standard
se hai tempo.
