Surchage d'opérateur

Résolu
Utilisateur anonyme -  
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   -
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

mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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
Utilisateur anonyme
 
Ok merci c'est exactement ce que je cherchais.
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
De rien bonne continuation :-)
0
Utilisateur anonyme > mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention  
 
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
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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