begin process at 2012 05 28 08:36:20
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

Classe Template - Probleme d'edition de lien


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Classe Template - Probleme d'edition de lien

lundi 22 décembre 2008 à 14:15:00 | Classe Template - Probleme d'edition de lien

ano2345

Bonjour a tous,

 

J'essaie de developer sous Dev-C++ 4.9.9.2 une classe template MyVector qui contient un element qui est un objet vector.

J'ai commence par developper cette classe en considerant uniquement des vector<float>, et tout a tres bien fonctionne (le code suit) :

 

Fichier MyVector.hpp

#ifndef MyVector_hpp

#define MyVector_hpp

 

#include <vector>

using namespace std;

 

class MyVector

{

private:

    vector<float> m_Vector;

           

public:

    MyVector() {}

    MyVector(vector<float>& Vect);

    virtual ~MyVector() {}

    int size() const { return m_Vector.size(); }

    float operator[](int i) const { return m_Vector[i]; }

    void push_back(float f) { m_Vector.push_back(f); }

    MyVector& operator=(const MyVector& MyVect);

    MyVector operator+(const MyVector& MyVect) const;

    MyVector operator*(const MyVector& MyVect) const;

    friend ostream& operator<<(ostream& os, const MyVector& MyVect);

};

 

#endif

 

Fichier MyVector.cpp

#ifndef MyVector_cpp

#define MyVector_cpp

 

#include "MyVector.hpp"

#include <vector>

#include <iostream>

using namespace std;

 

MyVector::MyVector(vector<float>& Vect)

{

    int i;

    for (i = 0; i < Vect.size(); i++) m_Vector.push_back(Vect[i]);

}

 

 

MyVector& MyVector::operator=(const MyVector& MyVect)

{

    if (this == &MyVect) return *this;

    m_Vector.erase(m_Vector.begin(), m_Vector.end());

    int i;

    for (i = 0; i < MyVect.size(); i++) m_Vector.push_back(MyVect[i]);

    return *this;

}

 

   

MyVector MyVector::operator+(const MyVector& MyVect) const

{

    MyVector Sum;

    if (m_Vector.size() != MyVect.m_Vector.size())

    {

        cout << "MyVector::operator+() - sizes don't match: program terminating\n";

        exit(EXIT_FAILURE);    

    }

    int i;

    for (i = 0; i < m_Vector.size(); i++) Sum.push_back(m_Vector[i] + MyVect.m_Vector[i]);

    return Sum;        

}

 

   

MyVector MyVector::operator*(const MyVector& MyVect) const

{

    MyVector Product;

    if (m_Vector.size() != MyVect.m_Vector.size())

    {

        cout << "MyVector::operator*() - sizes don't match: program terminating\n";

        exit(EXIT_FAILURE);    

    }

    int i;

    for (i = 0; i < m_Vector.size(); i++) Product.push_back(m_Vector[i] * MyVect.m_Vector[i]);

    return Product;        

}   

 

 

ostream& operator<<(ostream& os, const MyVector& MyVect)

{

    int i;

    for (i = 0; i < MyVect.size(); i++) cout << MyVect[i] << "\t";

    return os;       

}

 

#endif

 

Fichier TestMyVector.cpp

#include "MyVector.hpp"

#include <vector>

#include <iostream>

using namespace std;

 

int main()

{

    vector<float> V1;

    int i;

    for (i = 1; i < 7; i++) V1.push_back(i*i*i);

   

    MyVector MV1(V1);

    cout << "size(MV1) = " << MV1.size() << "\n";

    cout << MV1 << "\n";

   

    return 0;       

}

 

 

Puis, j'ai ensuite decide de construire la meme classe,  mais plus generale, en utilisant les template :

 

Fichier MyVector.hpp

#ifndef MyVector_hpp

#define MyVector_hpp

 

#include <vector>

using namespace std;

 

template<class T>

class MyVector

{

private:

    vector<T> m_Vector;

           

public:

    MyVector() {}

    MyVector(vector<T>& Vect);

    virtual ~MyVector() {}

    int size() const { return m_Vector.size(); }

    float operator[](int i) const { return m_Vector[i]; }

    void push_back(T f) { m_Vector.push_back(f); }

    MyVector<T>& operator=(const MyVector<T>& MyVect);

    MyVector<T> operator+(const MyVector<T>& MyVect) const;

    MyVector<T> operator*(const MyVector<T>& MyVect) const;

    friend ostream& operator<<(ostream& os, const MyVector<T>& MyVect);

};

 

#endif

 

Fichier MyVector.cpp

#include "MyVector.hpp"

#include <vector>

#include <iostream>

using namespace std;

 

 

template<class T>

MyVector<T>::MyVector(vector<T>& Vect)

{

    int i;

    for (i = 0; i < Vect.size(); i++) m_Vector.push_back(Vect[i]);

}

 

 

template<class T>

MyVector<T>& MyVector<T>::operator=(const MyVector<T>& MyVect)

{

    if (this == &MyVect) return *this;

    m_Vector.erase(m_Vector.begin(), m_Vector.end());

    int i;

    for (i = 0; i < MyVect.size(); i++) m_Vector.push_back(MyVect[i]);

    return *this;

}

 

 

template<class T>

MyVector<T> MyVector<T>::operator+(const MyVector<T>& MyVect) const

{

    MyVector<T> Sum;

    if (m_Vector.size() != MyVect.m_Vector.size())

    {

        cout << "MyVector::operator+() - sizes don't match: program terminating\n";

        exit(EXIT_FAILURE);    

    }

    int i;

    for (i = 0; i < m_Vector.size(); i++) Sum.push_back(m_Vector[i] + MyVect.m_Vector[i]);

    return Sum;        

}

 

   

template<class T>

MyVector<T> MyVector<T>::operator*(const MyVector<T>& MyVect) const

{

    MyVector<T> Product;

    if (m_Vector.size() != MyVect.m_Vector.size())

    {

        cout << "MyVector::operator*() - sizes don't match: program terminating\n";

        exit(EXIT_FAILURE);    

    }

    int i;

    for (i = 0; i < m_Vector.size(); i++) Product.push_back(m_Vector[i] * MyVect.m_Vector[i]);

    return Product;        

}   

 

 

 

template<class T>

ostream& operator<<(ostream& os, const MyVector<T>& MyVect)

{

    int i;

    for (i = 0; i < MyVect.size(); i++) cout << MyVect[i] << "\t";

    return os;       

}

 

#endif

 

Fichier TestMyVector.cpp

#include "MyVector.hpp"

#include <vector>

#include <iostream>

using namespace std;

 

int main()

{

    vector<float> V1;

    int i;

    for (i = 1; i < 7; i++) V1.push_back(i*i*i);

   

    MyVector<float> MV1(V1);

    cout << "size(MV1) = " << MV1.size() << "\n";

    cout << MV1 << "\n";

    return 0;       

}

 

 

Cette fois, lorsque que j'essaie de compiler cette version template, j'obtiens des erreurs d'editions.

Je ne reussis a compiler que si :

-          je remplace #include "MyVector.hpp" par #include "MyVector.cpp" dans le fichier TestMyVector.cpp

-          j'elimine toute trace de la fonction operator<< des 3 fichiers.

 

Quelqu'un pourrait-il m'expliquer pourquoi je ne peux pas compiler comme avec la classe non template ? (je m'arrache les cheveux)

 

Merci par avance,

Ano

jeudi 25 décembre 2008 à 18:29:04 | Re : Classe Template - Probleme d'edition de lien

humpff

Le problème est que l'on ne peut pas écrire les définitions des fonctions dans un fichier source lorsque l'on utilise des templates.

2 solutions s'offrent à toi: soit tout définir dans ton header, soit créer un autre fichier (par exemple .txx) pour écrire toutes tes définitions et faire un appel à ce fichier à la fin de ton .h avec #include fichier.txx. Les 2 reviennent au même.




Cette discussion est classée dans : const, vector, operator, myvector, myvect


Répondre à ce message

Sujets en rapport avec ce message

Calculer barycentre [std::vector] [ par skone007 ] Voilà je suis toujours dans mon pseudo moteur 3D enfin bref je suis en train de coder un petite fonction pour calculer le barycentre enfin calculer le Template: Spécialisation partielle [ par luhtor ] Bonsoir, j'ai une classe définie comme suit: template class operator_binary_pow;et notamment une fonction membre: template inline _T operator_bina un vector d'objet qui refuse d'être const pour utiliser les méthodes de l'objet [ par Icarius44 ] classe matrice [ par pabreto ] bonjour!je dois écrire le matrice.c d'une classe de matrice à partir d'un matrice.h que l'on me donne et que je n'a pas le droit de modifier.voici mes Surcharge d'opérateur [ par lucyhle ] Bonjour, J'ai des trous de mémoires de de compétences sur la surcharge d'opérateur. A quoi ca sert? Par exemple ici: pourquoi surcharge t'on les opé Template et operator= (c++) [ par Crownless00 ] J'ai la classe template suivante :template class Point3D{public :    Point3D(Type posX, Type posY, Type posZ) {...}    Point3D() {x = 0; y = 0; z = 0; VC++ 6 /recompilé sur VC++ 2005 [ par lui88 ] Bonjour , j'essai de recompilé mon programme sur VC++ 2005 , mais plein d'erreur s'affiche :s. j'en est reglé une grande partie mais là je n'y arrive Créer un classe de matrice [ par kazeton ] Bonjour à tous,Je débute en c++ et je voudrais réaliser un classe de matrice.On m'a donné le .h et on m'a demandé de réaliser un .cc afin de définir t operator[] [ par lovo ] Salut, je créer une classe matrice en ce moment avec comme data member un double**. Je n'arrive pas a faire l'opérateur d'acces à ma matrice [code=cp


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,905 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales