Partage
  • Partager sur Facebook
  • Partager sur Twitter

Destruction d'objet et surcharge d'opérateur

Sujet résolu
    22 octobre 2018 à 23:39:45

    Bonjour,

    J'essaye de faire une classe pour du calcul matriciel et mon problème est que pour une opération du type : n = m * m, le destructeur du m * m calculé est appelé avant l'opérateur = et donc au moment de parcourir la matrice pour l'opérateur =, j'ai un segment fault

    Et ma question est donc : comment contourner ce problème ?

    L'opérateur *:

    Matrix operator*(Matrix & m1, Matrix & m2)
    {
    	Matrix buf(m2.get_w(), m1.get_h());
    
    	if (m1.get_w() == m2.get_h())
    	{
    		for (int i = 0; i < m2.get_w(); i++)
    			for (int j = 0; j < m1.get_h(); j++)
    				for (int k = 0; k < m2.get_h(); k++)
    					buf.set(i, j, buf.get(i, j) + m1.get(k, j) * m2.get(i, k));
    	}
    	return buf;
    }

    L'opérateur = :

    Matrix &Matrix::operator=(Matrix m)
    {
    	if (_mat != nullptr)
    	{
    		for (int i = 0; i < _w; i++) delete _mat[i];
    		delete _mat;
    	}
    
    	_w = m.get_w(); _h = m.get_h();
    	
    	
    
    	if (_w * _h != 0)
    	{
    		_mat = new double*[_w];
    		for (int i = 0; i < _w; i++)
    			_mat[i] = new double[_h];
    
    		for (int i = 0; i < _w; i++)
    			for (int j = 0; j < _h; j++)
    				_mat[i][j] = m.get(i, j);
    	}
    	return *this;
    }



    Merci d'avance

    Edit : il manquait simplement le constructeur de copie


    -
    Edité par kickflip1408 23 octobre 2018 à 0:08:06

    • Partager sur Facebook
    • Partager sur Twitter
      23 octobre 2018 à 8:52:42

      Lu'!

      N'utilise pas new et delete à moins de bien savoir ce que tu fais. Formellement, ton opérateur "=" est faux parce que tu ne considères pas les exceptions.

      Et pour ton opérateur d'ailleurs, regarde du côté de l'diome copy and swap.

      -
      Edité par Ksass`Peuk 23 octobre 2018 à 8:53:59

      • Partager sur Facebook
      • Partager sur Twitter

      Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

        23 octobre 2018 à 9:31:19

        Salut,

        Pourquoi tu te casses la tête avec des pointeurs en fait ?

        • Partager sur Facebook
        • Partager sur Twitter
          26 octobre 2018 à 20:10:55

          Bonjour,

          Utiliser les new[] et delete[] est quelque chose à éviter car on a mieux et moins risqué.
          Néanmoins pourquoi pas. Il faut alors à tout prix bien comprendre certains concepts:
          a) la const correctness (en gros comment bien utiliser le mot const.)
          b) les divers types de paramètre (par exemple : par référence, par copie, ...)
          c) les 3 fonctions spéciales (devenues 5 depuis le C++11.)

          Ton exemple , si j'ai bien compris, ça plante en voulant récupérer le résultat de la multiplication de 2 matrice

          Matrix m1, m2, m3;
          m1 = m2 * m3; // plante !
          // vérifie :
          Matrix m4 = m1 * m2 * m3; // ne compile pas !

          Si tu essaies de multiplier 3 matrices, ça ne compile pas. Pourquoi?

          En ajoutant le constructeur de copie, ça ne plante plus. As-tu compris pourquoi?
          Ton opérateur= a besoin du constructeur de copie. Tel que tu l'as créé il reçoit un paramètre par copie. Donc pour copier une matrice, on crée une copie qui est passée en paramètre pour être ensuite copiée dans ton opérateur. Il y a deux fois copie!

          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            26 octobre 2018 à 21:28:37

            d) l'exception safety...

            Et faire un code correct respectant ce point, c'est très galère.

            • Partager sur Facebook
            • Partager sur Twitter

            Destruction d'objet et surcharge d'opérateur

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown