surcharge *, +, -‘opérateurs pour le vecteur classe

J’écris une classe Line pour créer des méthodes numériques et je veux que ces opérateurs (*, +, -) rendent mon code plus lisible et plus facile à comprendre.

#include  using namespace std; typedef vector Vector; class Line : public Vector { public: Line(); ~Line(); Line operator+(Line); Line operator-(Line); Line operator*(double); }; Line Line::operator*(double alfa) { Line temp; int n = size(); temp.resize(n); for (int i = 0; i at(i)*alfa; } return temp; } Line Line::operator+(Line line) { int n = size(); Line temp; temp.resize(n); for (int i = 0; i at(i) + line[i]; } return temp; } Line Line::operator-(Line line) { int n = size(); Line temp; temp.resize(n); for (int i = 0; i at(i) - line[i]; } return temp; } int main() { return 0; } 

Est-il possible de surcharger de tels opérateurs de la classe Vector? Devrais-je simplement créer des fonctions (ou méthodes) au lieu d’opérateurs? d’autres suggestions?

ps1: J’utilise Visual Studio 11 comme compilateur.

ps2: Je n’ai pas démarré le projet en tant que “projet Win32”, c’est une application console.

Je reçois les erreurs suivantes:

 Error 1 error LNK2019: unresolved external symbol "public: __thiscall Line::Line(void)" (??0Line@@QAE@XZ) referenced in function "public: class Line __thiscall Line::operator*(double)" (??DLine@@QAE?AV0@N@Z) C:\Users\Lucas\Documents\Visual Studio 11\Projects\test\test\test.obj test Error 2 error LNK2019: unresolved external symbol "public: __thiscall Line::~Line(void)" (??1Line@@QAE@XZ) referenced in function "public: class Line __thiscall Line::operator*(double)" (??DLine@@QAE?AV0@N@Z) C:\Users\Lucas\Documents\Visual Studio 11\Projects\test\test\test.obj test 

Vous devez surcharger les opérateurs au niveau global:

 vector operator*(const vector& v, double alfa) { ... } vector operator+(const vector& v1, const vector& v2) { ... } vector operator-(const vector& v1, const vector& v2) { ... } 

En ce qui concerne les erreurs de l’éditeur de liens, il semblerait que vous n’ayez pas implémenté le constructeur et le destructeur Line.

L’erreur de l’éditeur de liens vous indique qu’il manque dans votre code les définitions des deux fonctions membres que vous avez déclarées – le constructeur et le destructeur:

 Line::Line() { // Code of the constructor goes here } Line::~Line() { // Code of the destructor goes here } 

Vous ne devriez jamais hériter des classes std qui ne sont pas destinées à l’inheritance. Hériter de classes n’ayant pas de destructeur virtuel est très dangereux.

Je vous suggérerais d’utiliser l’agrégation: faites que votre classe Line contienne un membre de type vector , nommé myVector_ par exemple, et implémente les opérateurs souhaités de manière à utiliser cette variable de membre.

Donc, vous remplacez tous les appels à size() à myVector.size() etc.:

 Line Line::operator*(double alfa) { Vector temp; int n = myVector_.size(); temp.resize(n); for (int i = 0; i < n; i++) { temp.at(i) = myVector_.at(i)*alfa; } return temp; } 

La bonne chose à faire est sûrement d’avoir un object Vector à l’intérieur de la ligne et de ne pas “hériter” de Vector? Généralement, hériter de std:: containers n’est pas une bonne donnée … Je suis presque sûr qu’une “ligne” n’est pas réellement un vecteur, c’est un “a un” vecteur. [La règle pour “quand vous héritez” est “X est un Y”, où vous créez un object composite quand “X a un Y” – donc il y a un Y dans X.]

Vous devrez déclarer votre constructeur et votre destructeur pour vous débarrasser de votre erreur de liaison.

Je voudrais aussi utiliser const Line& comme votre entrée dans les opérations mathématiques, car vous ne modifiez jamais l’entrée.