Newsgroup: it.comp.lang.c++
Titolo: Stile

1)
MyType a(b)
è meglio di
MyType a = b
?
2) Chiamare sempre i costruttori o gli pseudo-costruttori (per i tipi 
built-in) nella lista dei costruttori, anziché nel corpo del 
costruttore? Se non sbaglio, il compilatore chiama automaticamente tutti 
i costruttori di default relativi agli oggetti per i quali non si 
chiamano esplicitamente i costruttori in lista, anche se questi verranno 
chiamati nel corpo del costruttore.
3) Evitare la "derivazione" privata e usare invece la composizione?
Kiuhnm

 3) Evitare la "derivazione" privata e usare invece la composizione?
Secondo me questo va valutato caso per caso. E' vero che la derivazione
crea un accoppiamento piu' forte, ma la necessita' di scrivere
esplicitamente tutte le funzioni membro di delega e' noioso, porta
facilmente ad errori ed ostacola il refactoring.
Ciao,
Nicola

 facilmente ad errori ed ostacola il refactoring.
Oppure includi l'oggetto della classe base come pubblico. Però penso a 
cosa succede se utente e funzioni della classe derivata lavorano 
contemporaneamente sull'oggetto intralciandosi a vicenda.
Kiuhnm

 facilmente ad errori ed ostacola il refactoring.
Non vedo la necessita' di scrivere esplicitamente tutte le funzioni 
membro di delega.
Dato che la derivazione e' privata, potrebbe essere del tutto nascosta 
al mondo esterno.
In secondo luogo, volendo pubblicare delle funzioni basta usate la 
direttiva "using" dentro la classe derivata.
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila

 direttiva "using" dentro la classe derivata.
Perché "using"?
class Goldfish : Pet { // Private inheritance
public:
   Pet::eat; // Name publicizes member
   Pet::sleep; // Both overloaded members exposed
};
Kiuhnm


Hai ragione nel dire che non è necessario.
Ma e' valido anche il seguente codice:
class Goldfish : Pet { // Private inheritance
public:
   using Pet::eat; // Name publicizes member
   using Pet::sleep; // Both overloaded members exposed
};


 direttiva "using" dentro la classe derivata.
Mi riferivo alla composizione. Se uno deve ereditare privatamente e poi
delegare, tanto vale che erediti pubblicamente.
Ciao,
Nicola


Perche' questa e' una sintassi deprecata. La nota al paragrafo 11.3
dello standard dice: "Access declarations are deprecated; member
usingdeclarations
(7.3.3) provide a better means of doing the same things. In earlier
versions of the C++ language, access declarations were more limited;
they were generalized and made equivalent to usingdeclarations
in the interest of simplicity. Programmers are encouraged to use
usingdeclarations,
rather than the new capabilities of access declarations,
in new code."
Ciao,
Nicola

 nella classe base in modo da evitare questa eventualità.
Prova questo e poi scommenta la linea commentata:
class MyClass
{
public:
    MyClass (int foo){
        foo = foo_;
    };
private:
    int foo_;
    MyClass (const MyClass&);
};
int main(){
    MyClass a(1);
    //MyClass b = 1;
    return 0;
}
-- 
Uccidete i filosofi e tenetevi riso e bacchette per voi.

 
Non ho notato niente di insolito.
Kiuhnm

 Non ho notato niente di insolito.
Perchè la linea "insolita" era commentata per permetterti di compilarlo.
Se decommenti 
MyClass b = 1;
qua da errore.
g++ -pedantic myclass.cc 
myclass.cc: In function 'int main()':
myclass.cc:10: error: 'MyClass::MyClass(const MyClass&)' is private
myclass.cc:17: error: within this context
myclass.cc:10: error: 'MyClass::MyClass(const MyClass&)' is private
myclass.cc:17: error: within this context
myclass.cc:17: error:   initializing temporary from result of
'MyClass::MyClass(int)'


 qua da errore.
Non da me.
Il VC++ 6 ottimizza chiamando MyClass(int) /e/ (ne deduco da quanto 
dici, ignorando lo standard) non segnala l'errore.
Forse dovrei passare al 7.
Kiuhnm

 Forse dovrei passare al 7.
IMHO è una buona idea. Il VC++ 6 è fuori standard per alcune cose (e per
esempio ha i templates abbastanza buggati).
Oppure puoi provare a vedere se ha qualche opzione per renderlo più
"severo". Comunque suggerirei di passare al 7, che comunque AFAIK è
anche un compilatore "migliore" sotto altri punti di vista.



Se non giocano fattori diversi dallo studio del linguaggio per
interesse personale probabilmente ti conviene scaricarti VC++ 2005
Express che contiene il compilatore 8.0 .
Assumendo che tu preferisca comunque rimanere con Microsoft.
Ciao,
Nicola