Newsgroup: it.comp.lang.c++
Titolo: E' UN BUG?

Sarei grato a chiunque potesse risolvere questo problema:
#include <iostream>
#include <conio>
class Member
{
  private:
    int i;
  public:
    // Nota: nessun costruttore di default
    /* ma ottengo lo stesso output se faccio
    Member()
    : i(0) {  }*/
    Member(int ii)
    : i(i)
    {
      cout << "costruttore di member\n";
      cout << "i = " << i << '\n';
    }
    int get() const { return i; }
};
class Base
{
  private:
    float f;
  public:
    Base(float ff)
    : f(ff)
    {
      cout << "costruttore della base\n";
      cout << "f = " << f << '\n';
    }
    Base(Member mm)
    : f(mm.get())
    {
      cout << "costruttore della base\n";
      cout <<  "f = " << f << '\n';
    }
};
class Derived : public Base
{
  private:
    Member m;
  public:
    Derived(int ii, float ff)
    : m(ii), Base(ff)
    {
      cout << "costruttore del derivato\n";
    }
    Derived(int ii)
    : m(ii), Base(m)
    {
      cout << "costruttore del derivato\n";
    }
};
main()
{
  Derived d(2, 4.5);
  cout << endl;
  Derived(2);
  getch();
}
-------------------------------------
L'output è:
costruttore della base
f = 4.5
costruttore del membro
i = 1
costruttore del derivato
costruttore della base
f = 4.23805e+06
costruttore del membro
i = 4238048
costruttore del derivato
E' un bug del mio 'scassatissimo' BCC 5.2, vero?
Nota:
  d'altronde non mi posso lamentare visto che l'ho ottenuto gratis da una
  rivista;
Mi potreste spiegare che cosa avviene o dovrebbe avvenire?
Grazie,  Manlio Perillo

Mi potreste spiegare che cosa avviene o dovrebbe avvenire?
Hai inizializzato Member::i in modo errato.
Paolo
--------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
--------------------------------------------------

     : i(i)
Inizializzi i con i stesso invece che con ii.
EMG


Hai ragione, non me ne ero accorto.
Il problema comunque resta, con la correzione ottengo:
costruttore della base
f = 4.5
costruttore di member
i = 2
costruttore del derivato
costruttore della base
f = 4.23806e+06                   ?????
costruttore di member
i = 2
costruttore del derivato
La questione è nella chiamata al costruttore:
Derived(int ii)
    : m(ii), Base(m)
Con cosa inizializza Base se m stesso non è ancora stato inizializzato??
Non dovrebbe essere un errore?
Inoltre il fatto che elenco il costruttore della classe Base dopo il
costruttore della
classe membro non dovrebbe essere vietato??
(Infatti, ma non vorrei sbagliare,  i costruttori vengono eseguiti
nell'ordine in
cui sono elencati - ma il costruttore della classe base viene SEMPRE
eseguito per
primo)
Grazie per l'interessamento  Manlio Perillo

 primo)
L'ordine degli elementi nell'elenco degli inizializzatori non ha nessuna
importanza: per prima cosa viene inizializzata la base class, poi i membri
nell'ordine in cui sono dichiarati nella classe. Quindi, stai sbagliando: i
costruttori non vengono costruiti nell'ordine in cui sono elencati, ma
nell'ordine in cui le varibili membro sono dichiarate.
Potresti seguire con il debugger quello che succede...


 classe membro non dovrebbe essere vietato??
Infatti.
EMG

classe membro non dovrebbe essere vietato??
No, la regola dice "prima i costruttori delle classi base e poi
quelli dei data member nell'ordine in cui sono dichiarati".


me lo segnala e comunque li inverte automaticamente.
Questo e` molto strano, lo standard dice chiaramente come
il compilatore deve ordinare le chiamate ai costruttori. Anzi
era sostanzialmente gia` cosi` prima dello standard (almeno
limitatamente ai costruttori di classe base).


 limitatamente ai costruttori di classe base).
Aspetta, forse mi sono espresso male. Io posso anche metterli invertiti
rispetto allo standard ma il compilatore fa sempre le cose come vanno
fatte. Però in quel caso me lo segnala. Tutto qui.
EMG

 wrote in message
38A5DC08...@flashnet.it...

La cosa mi è molto strana. Se si ottiene:
costruttore della base
f = 0
costruttore di member
i = 2
Significa che la variabile menbro di Member è stata inizializzata a zero
(oppure è solo un
caso fortuito che abbia proprio tale valore);
ma allora quando è stata inizializata?
Manlio Perillo

ma allora quando è stata inizializata?
Non ho piu` il post iniziale, non saprei risponderti.
Ricordo comunque che per come era fatto, era possibile
avere valori casuali relativamente a 'i'.
