Surchage d'opérateur

Résolu/Fermé
Signaler
-
Messages postés
30551
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
24 janvier 2022
-
Bonjour,
Je souhaite créer une méthode de la classe vecteur qui a pour but de retourner la différence entre l'instance et un autre Vecteur, mais il y a un problème car je n'y arrive pas, voilà la méthode avec l'opérateur
double Vecteur::soustractionVec(Vecteur const & autreVec)
{
	return -autreVec; //ici l'idée est de faire : instance - autreVec mais je n'y arrive pas 
}

Vecteur Vecteur::operator-(Vecteur const & source)
{
	return Vecteur(m_x-source.m_x, m_y-source.m_y); //une simple soustraction de vecteur
}

3 réponses

Messages postés
30551
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
24 janvier 2022
7 273
Bonjour,

Pour commencer, je t'invite à regarder la classe std::vector<T>
http://www.cplusplus.com/reference/vector/vector/

S'il te manque des opérateurs tu peux tout à fait les définir (ils faudra qu'ils soient
template
).

Mais j'imagine qu'ici ton but est plutôt de t'exercer. Donc voici ci-dessous un exemple simple qui te montre des surcharges d'opérateurs. Le but n'est pas ici de proposer une classe générique (j'ai hardcodé un tableau de 5 entiers), le code se généralise à n éléments de mêmes types sous réserves de faire des allocations mémoires et d'utiliser des templates. Afin de ne pas noyer le poisson avec ces deux notions supplémentaires, je reste donc sur l'exemple simple.

#include <iostream>

class my_vector {
  private:
    int m_data[5];
  public:
    my_vector(){}

    int & operator[] (std::size_t i) {
      return this->m_data[i];
    }

    int operator[] (std::size_t i) const {
      return this->m_data[i];
    }
};

my_vector operator - (
  const my_vector & x,
  const my_vector & y
) {
  my_vector r;
  for (std::size_t i = 0; i < 5; i++) {
    r[i] = x[i] - y[i];
  }
  return r;
}

std::ostream & operator << (
  std::ostream & os,
  const my_vector & x
) {
  os << '[';
  for (std::size_t i = 0; i < 5; i++) {
    os << ' ' << x[i];
  }
  os << " ]";
  return os;
}

int main() {
  my_vector x;
  x[0] = 10;
  x[1] = 20;
  x[2] = 30;
  x[3] = 40;
  x[4] = 50;
  std::cout << "x = " << x << std::endl;

  my_vector y;
  y[0] = 1;
  y[1] = 2;
  y[2] = 3;
  y[3] = 4;
  y[4] = 5;
  std::cout << "y = " << y << std::endl;

  std::cout << "x - y " << (x - y) << std::endl;
  return 0;
}


Ce qui donne :

(mando@velvet) (~) $ g++ vector.cpp 
(mando@velvet) (~) $ ./a.out
x = [ 10 20 30 40 50 ]
y = [ 1 2 3 4 5 ]
x - y [ 9 18 27 36 45 ]


Bonne chance
1

Ok merci c'est exactement ce que je cherchais.
0
Messages postés
30551
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
24 janvier 2022
7 273
De rien bonne continuation :-)
0
Utilisateur anonyme >
Messages postés
30551
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
24 janvier 2022

Bonjour c'est encore moi,
Une simple question : Pourquoi certains de vos operateurs sont dans la classe et d'autre non , qu'est ce qui change ?
0
Messages postés
30551
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
24 janvier 2022
7 273
Pour
[]
tu n'as pas le choix car sinon ça ne compilera pas.

Pour
<<, +, -
, il existe une syntaxe pour les déclarés à l'intérieur de la classe mais personnellement je préfère déclarer les opérateurs autant que possible en dehors de la classe, question de goûts.

Note cependant que dans la classe, cela signifie que l'opérande gauche est du type de ta classe. Or quand tu utilises
<<
, c'est pour écrire dans un flux (e.g.
std::cout << x
) donc clairement, le déclarer dans la classe serait un contre sens.
https://stackoverflow.com/questions/9351166/does-overloading-operator-works-inside-the-class

Bonne chance
0