Newsgroup: it.comp.lang.c++
Titolo: problema con i costruttori

Mi servirebbe una mano con i costruttori.
Stò studiando c++ e non riesco ancora a far funzionare questo codice.
Dovrei chiamare il costruttore del padre e poi fare le altre
operazioni.
Il problema è qui:
mammifero::mammifero(int latteprodotto)
{
	animale("MAMM");
	mammifero::latteprodotto=latteprodotto;
	cout << "Ho creato un mammifero, dna:" <<
mammifero::leggidna() << " e latte:" << mammifero::latte() << "\n";
}
provaqui.cpp: In method `mammifero::mammifero(int)':
provaqui.cpp:39: no matching function for call to `animale::animale()'
provaqui.cpp:11: candidates are: animale::animale(const animale &)
provaqui.cpp:14:                 animale::animale(string)
qui sotto il codice:
#include <iostream>
#include <string>
class animale
{
	string dna;
	public:
	animale(string dna);
	~animale();
	string leggidna();
};
animale::animale(string dna)
{
	animale::dna=dna;
	cout << "Ho creato un animale con il seguente dna:" <<
animale::leggidna() << "\n";
}
animale::~animale()
{
	cout << "Ho distrutto un animale con il seguente dna:" <<
animale::leggidna() << "\n";
}
string animale::leggidna()
{
	return (animale::dna);
}
class mammifero:animale
{
	int latteprodotto;
	public:
	mammifero(int latteprodotto);
	~mammifero();
	int latte();
};
mammifero::mammifero(int latteprodotto)
{
	animale("MAMM");
	mammifero::latteprodotto=latteprodotto;
	cout << "Ho creato un mammifero, dna:" <<
mammifero::leggidna() << " e latte:" << mammifero::latte() << "\n";
}
mammifero::~mammifero()
{
	cout << "Ho distrutto un mammifero, dna:" <<
mammifero::leggidna() << " e latte:" << mammifero::latte() << "\n";
}
mammifero::latte(void)
{
	return (latteprodotto);
}
int main(int argc, char *argv[])
{
animale bestia("ABC");
mammifero pecora(5);
return(0);
}
Ringrazio anticipatamente chi mi aiuterà.

 
-- 
sbi e... uhmmm

 
Risposta corta:
  sposta animale("MAMM") fuori dal corpo del costruttore:
  mammifero::mammifero(int latteprodotto) : animale("MAMM") {
    // etc.
  }
Risposta lunga:
Considera una classe base B e una sua derivata D
class B {
  int b;
 public:
  B(int n);
};
class D : public B {
  int d:
  D(int n, int m);
};
Puoi vedere un oggetto di classe D, come un oggetto di classe B con un
intero in piu'. Prima di eseguire il corpo del costruttore di D il
compilatore deve essere in grado di costruire completamente la parte B,
che va quindi specificata prima del body:
D::D(int n, int m) : B(n) { d = m; }
Se scrivessi
D::D(int n, int m) { B(n) ; d = m; }
il compilatore (prima di eseguire il corpo del costruttore di D)
proverebbe a costruire la parte B, provando quindi a chiamare un
costruttore B::B() (che non trova, come appunto dice il tuo messaggio di
errore)
poi costruirebbe un B(n) temporaneo, da buttar via e quindi assegneerbbe
m a d 
(nota che il modo piu' corretto sarebbe quello di assegnare anche d fuori
dal body)
D::D(int n, int m) : B(n), d(m) {}
in questo modo quando entri nel corpo del costruttore i dati sono gia'
inizializzati (e puoi scrivere un messaggio per es.).
Nota anche che, se B avesse un costruttore di default (o un valore di
default per il suo parametro) le cose possono diventare piu' pericolose:
class B {
 protected:
  int b;
 public:
  B(int n=0) : b(n) {}
  virtual ~B() {}
};
class D : public B {
  int d;
 public:
  D(int n, int m) { 
    B(n);  // INUTILE!
    d=m;
    std::cout << "n = " << n << " m = " << m << "\n"l  } 
};
int main() {
  D( 2, 3);
}
compilera' senza errori ma l'output sara':
n = 0 m = 3
Fabio
-- 
I'm feeling Lucky!

      animale unaBestiaPolimorfa = new mammifero(6);
E.C.: animale*
-- 
sbi