Newsgroup: it.comp.lang.c++
Titolo: tipi di classe

Il problema è questo: ho una classe PARENT e tante classi da essa derivate
CHILD1 CHILD2 che si differenziano per il costruttore.
Una classe ALFA ha come membri 3 oggetti PARENT:
PARENT A1,A2,A3;
devo creare un metodo che inizializzi questi membri con una delle classi
derivate che passo come parametro, ovvero devo fare qualcosa del tipo:
ALFA::SET(tipodiclassefigliadiparent){
    A1=tipodiclassefigliadiparent();
    A2=tipodiclassefigliadiparent();
    A3=tipodiclassefigliadiparent();
};
E' importante che ad ogni assegnazione si passi per il costruttore della
classe.
Sapreste aiutarmi indicandomi cosa dovrei passare come parametro e come
utilizzarlo nelle assegnazioni?
1K grazie

 derivate che passo come parametro, ovvero devo fare qualcosa del tipo:
class PARENT { };
class CHILD1: PARENT { };
class CHILD2: PARENT { };
class CHILD3: PARENT { };
class ALPHA {
        PARENT  parent_1, parent_2, parent_3;
        SET( ... );
};
ALFA::SET(  PARENT &p1, PARENT &p2,  PARENT &p3 ){
        parent_1 = p1;
        parent_2 = p2;
        parent_3 = p3;
};
Si puo' inizializzare una classe base con un classe derivata, perche' la 
derivata è _anche_ una classe base...

ALFA::SET(  PARENT &p1, PARENT &p2,  PARENT &p3 ){
???????
Vedi sopra.
Che linguaggio è questo? Se è C++, allora deve trattarsi di una forma
preistorica ;-)
Ciao
Domenico Barra

 nome della classe base?
Non dovrebbe essercene una implicita ?
Però non ricordo se implicitamente è pubblica o privata :-(
Massimo

 Però non ricordo se implicitamente è pubblica o privata :-(
privata

Però non ricordo se implicitamente è pubblica o privata :-(
Implicitamente non è un bel niente. Bisogna sempre specificare l'accesso ai
membri della classe base.
Ciao
Domenico Barra


Ciao,
Innanzitutto la classe Alfa avra' tre puntatori a classe Parent, altrimenti 
avresti dei problemi di "slicing" (perderesti cioe' le informazioni in piu' delle
classi figlie).
Per inizializzare questi membri potresti passare al costruttore di Alfa una specie
di "factory",  con un metodo che crea un'istanza di classe derivata.
Esempio:
class Parent
{
public:
	Parent();
	virtual ~Parent();
	/* ... */
};
class ParentFactory
{
public:
	 ParentFactory();
	 ~ParentFactory();
	 virtual Parent * create() = 0;
};
class Alpha
{
	Parent *p1;
	Parent *p2;
	Parent *p3;
public:
	Alpha( ParentFactory & factory )
	{
		p1 = factory.create();
		p2 = factory.create();
		p3 = factory.create();
	}
	~Alpha()
	{
		delete p1;
		delete p2;
		delete p3;
	}
	/* ... */
};
class Child1 : public Parent { /* ... */ };
class Child2 : public Parent { /* ... */ };
class Child3 : public Parent { /* ... */ };
Le classi derivate da ParentFactory implementeranno il metodo virtuale create()
con una new dell'opportuna classe Child.
Nota che in questo modo la classe Alpha non ha bisogno di conoscere ne' i Child
ne' le classi derivate da ParentFactory, gli basta conoscere le interfacce (cioe'
le classi base).
Fabio
----------------------------------------------------------------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 4.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2442289
 
-- 
Posted from 
albatross-ext.wise.edt.ericsson.se
 [194.237.142.116] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Domenico Barra
Ciao
Marco Barisione









Scusate non so perché il mio programma ha inviato lo stesso messaggio
così tante volte
Marco Barisione

Tu dove hai letto questa informazione? Ti ringrazio.
Stroustrup, 15.3
--
Antonio Cuni, 18 anni, studente
Brainbench Certification: 
Master C++: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
http://www.brainbench.com/transcript.jsp?pid=1301688