Surchage d'opérateur

Résolu/Fermé
Utilisateur anonyme - 22 févr. 2017 à 20:48
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 27 févr. 2017 à 10:30
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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié par mamiemando le 23/02/2017 à 10:15
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
23 févr. 2017 à 18:39
Ok merci c'est exactement ce que je cherchais.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
24 févr. 2017 à 09:56
De rien bonne continuation :-)
0
Utilisateur anonyme > mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024
25 févr. 2017 à 15:16
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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
27 févr. 2017 à 10:30
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