recupere ou mettre a jour un tableau de double dans une classe

recupere ou mettre a jour un tableau de double dans une classe - C++ - Programmation

Marsh Posté le 01-11-2005 à 23:54:40    

Hola tout le monde,
 
J ai une classe du type:
 
[#ff0000][#ff0000]class myClass
{
pritate:
double toto[10];
 
public:
double get_toto(){return toto;};
void     set_toto(double tata){toto=tata;};
}
[/#ff0000][/#ff3800]
 
 
dans un progamme j ai un objet
 
 
double titi[10];
 
myClass *objet=new myClass();
 
titi=objet->get_toto();
objet->set_toto(titi);

 
Les deux derniere commande ne marche pas.... je ne sais pas comment recuperer ou mettre a jour mon tableau de double toto.... :( Quelqu un pourrait il m expliquer ? :(

Reply

Marsh Posté le 01-11-2005 à 23:54:40   

Reply

Marsh Posté le 02-11-2005 à 08:06:32    

Plusieurs raisons expliquant que cela ne fonctionne pas.  
 
- Tu uilise des tableau statiques => tu ne peux pas ecrire
  titi=get_toto(); mais tu devrais plutot ecrire une boucle for(inti ....) et remplir ton tableau statique element par element.
 
- ensuite tu utilise des tableaux et tes methodes de classe prennent en parametre une simple variable double. Il te faut donc passer des double* en parametre.
 
Essaies avec des trucs comme cela
class myClass {
private:
  int nbVal_;
  double* toto_;
   
public:
  myClass() : nbVal_(10) {
    toto_ = new double[nbVal_];
    init();
  }
  myClass(int val) : nbVal_(val) {
    toto_ = new double[nbVal_];
    init();
  }
  void init();
  double* get_toto(){return toto_;};
  void     set_toto(double* tata){toto_=tata;};
};
 
void myClass::init() {
  for(int i=0 ; i < nbVal_ ; i++)
    toto_[i] = i;
}
int main(void) {
  double* titi;  
  double tata[10] = {11,22,33,44,55,66,77,88,99,1010};  
  myClass *objet=new myClass();
   
  titi=objet->get_toto();
  std::cerr<< titi[3] << std::endl;
  objet->set_toto(tata);
  titi=objet->get_toto();
  std::cerr<< titi[3] << std::endl;
  return0;
}

Reply

Marsh Posté le 03-11-2005 à 21:51:58    

Code :
  1. myClass() : nbVal_(10) {
  2.     toto_ = new double[nbVal_];
  3.     init();
  4.   }
  5.   myClass(int val) : nbVal_(val) {
  6.     toto_ = new double[nbVal_];
  7.     init();
  8.   }


 
c'est quoi ça, on est pas en Java !
 

Code :
  1. myClass(int val = 10) : nbVal_(val) {
  2.     toto_ = new double[nbVal_];
  3.     init();
  4.   }

c'est mieux non ?

Reply

Marsh Posté le 03-11-2005 à 22:04:08    

Code :
  1. class myClass
  2. {
  3. private:
  4.   vecor<double> toto_;
  5.  
  6. public:
  7.   myClass(int val = 10) : toto_(val, 0.0) { }
  8.   const double* get_toto() {return &(toto_[0]);} // un peu crade mais conforme ISO98
  9.   void set_toto(const vector<double>& tata) {toto_ = tata;}
  10. };
  11. int main(void)
  12. {
  13.   const double* titi; 
  14.   double tata[10] = {11,22,33,44,55,66,77,88,99,1010};
  15.   vector<double> vecTata(tata, tata + 10); // tata en vecteur
  16.   myClass *objet=new myClass(); // le new ne sert à rien, la pile ça existe, on est pas en java
  17.  
  18.   titi=objet->get_toto();
  19.   std::cerr<< titi[3] << std::endl;
  20.   objet->set_toto(vecTata);
  21.   titi=objet->get_toto();
  22.   std::cerr<< titi[3] << std::endl;
  23.   return 0; // inutile
  24. }


 
remarques :

  • en C++ on a pas de garbage collector, mais on a la pile et la STL. Il faut utiliser un maximum la STL et faire le moins de new possible. Sans utilisation du polymorphisme, on peut faire du code sans aucun new, donc normalement sans fuite. Les new ne sont pas exception-safe. Ici dans ce code que je n'ai pas entièrement corrigé, il y a un new sans son delete. Sylvaing t'as fait trop de java :non:
  • il n'y a pas de point-virgule après une définition de méthode { code; }; <-- non ! { code } <-- oui
  • return 0; à la fin du main ne sert à rien.
  • ne pas oublier les const, éviter les pointeurs

Reply

Marsh Posté le 04-11-2005 à 00:56:52    

jesus_christ a écrit :

Les new ne sont pas exception-safe


typo ?

Reply

Marsh Posté le 04-11-2005 à 20:24:21    

ok j'exagère un peu, disons que pour rendre un new (ou malloc) exception safe, il faut ajouter du code, ce qui n'est pas le cas avec les containers.
 
ex :

Code :
  1. MaClasse::MaClasse()
  2. {
  3.    m_tata = new int[10];
  4.    m_toto = new float[42];
  5. }
  6. int main()
  7. {
  8.    MaClasse m;
  9. }


 
si le deuxième new échoue, lancement de bad_alloc et pas d'objet m créé. m_tata est perdu et innacessible.
 

Code :
  1. MaClasse::MaClasse()
  2. {
  3.    m_tata = vector<int>(10);
  4.    m_toto = vector<float>(42);
  5. }


 
Volume de code équivalent, si l'allocation à l'intérieur de vector<float>(42); échoue, la mémoire de m_tata est libérée.
 

Code :
  1. MaClasse::MaClasse() : m_tata(NULL), m_toto(NULL)
  2. {
  3.    try
  4.    {
  5.       m_tata = new int[10];
  6.       m_toto = new float[42];
  7.    }
  8.    catch (bad_alloc& )
  9.    {
  10.       delete[] m_tata;
  11.       delete[] m_toto;
  12.    }
  13. }


Lourd et moche.

Reply

Marsh Posté le 05-11-2005 à 00:02:10    

jesus_christ a écrit :

ok j'exagère un peu, disons que pour rendre un new (ou malloc) exception safe,


abus de langage (au mieux), je crois que l'on dirait plutot dans ce cas : rendre le constructeur exception safe.
 
Sinon, tes exemples illustre bien un des arguments principal contre les tableaux C-style en C++.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed