IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

vecteur en c++


Sujet :

C++

  1. #1
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut vecteur en c++
    Bonjour,
    alors j'essaye de comprendre comment créer de manière logique, une classe vecteur. Pour ça, je lis le cours du lien ci-joint.

    Donc, on donne à cette classe vecteur le nom de A, et on écrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    typedef double R; //définition du corps
    class A
    {private:
     
    int N;//taille du vecteur
    R *v; \\pointeur sur les N valeurs
     
    public:
     
    A()
    {cout<<"pas de constructeur par défaut"<<endl;}
     
    A(const A & a) : N(a.N), v(new R [a.N])
    {operator=(a)}
     
    A(int i) : N(i), v(new R[i])
    { assert(v);}
     
    A & operator = (A & a)
    {assert (N==a);
    for (int i=0; i<N;i++) v[i]=a.v[i];
    return *this;
    }
     
    ~ A()
    {
    delate [] v;
    }
     
    R & operator [](int i) const
    {
    assert (i>=0 && i<N);
    return v[i];
    }
    1- Je ne comprend pas la syntaxe des constructeur par copie, et pourquoi il utilise new? et il y'a combien de constructeurs? Il me semble qu'ils sont au nombre de 3 mais pourquoi tout ca?
    4- À quoi sert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    R & operator [](int i) const
    {
    assert (i>=0 && i<N);
    return v[i];
    }
    ?

    Je vous remercie par avance.
    Images attachées Images attachées
    • Type de fichier : pdf RNM.pdf (181,3 Ko, 160 affichages)

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Points : 44
    Points
    44
    Par défaut
    Bonjour, (réponse rapide)

    Sans vouloir te décourager aucunement, ce cours est obsolète. Depuis 2006, les choses ont pas mal changé dans l'univers C++, on n'utilise quasiment plus de pointeurs avec des new/delete, qui causait toujours beaucoup de souci aux débutants. Maintenant, c'est le RAII qui prime: allocation sur la pile et destruction automatique en fin de bloc.
    Et au lieu de déclarer le type de donnée par un typedef qui n'apporte pas grand chose, on créerait plutot une classe templatée, mais on va y aller doucement...

    Bref, essaie de trouver un cours plus moderne, ça sera plus pertinent. (cherche C++11, RAII

    Par ailleurs, pour l'exemple que tu évoques, le mieux est d'utiliser les conteneurs de la bibliothèque, en l'occurence std::vector est le plus adapté.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Vecteur
    {
       private:
          std::vector<double> _data;
       public:
          ...ici les méthodes
    };
    Pour tes questions sur les constructeurs: il y en a plusieurs parce qu'on peut vouloir créer un vecteur de plusieurs façons.

    La signature du contructeur de recopie est toujours:
    T(const T& t); (avec T le type)
    Ce qui signifie que l'argument est une reference constante du même type. Mais si tu utilises les conteneurs, tu n'as pas besoin de t'en préoccuper ! (un des interet de les utiliser, d'ailleurs...), tu laisse le compilateur en générer un implicite.

    Bon courage !

  3. #3
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    S'il vous plaît, vous avez utilisé
    std::vector<double> _data;

    1- qui est data? c'est un fichier qui contient les données? Comment organiser ces données, et doit-on mettre un include quelque part?
    2- Pour les constructeur, pouvez vous m'en dire un peu plus svp? Pourquoi il y'en a plusieurs et qu'est ce qu'ils font?
    3- avez vous un cours en français qui donne un exemple détaillé sur comment construire une classe de vecteur proprement pour comprendre? dans c++11 rai il n'y en a qu'en anglais.
    Merci beaucoup.

  4. #4
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    Je cherche désépéremment à construire une classe de vecteur en C++, afin de faire des addition entre deux vecteur et de multiplier un vecteur par un scalaire. (la taille des vecteurs doit être quelconque).

    Pouvez vous m'expliquer comment l'écrire, ou bien me donner un bon cours qui explique ça s'il vous plaît. Je suis vraiment perdue, je trouve pleins de choses différentes sur le net.


    Je vous remercie par avance.

  5. #5
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Un peu comme std::valarray ?

  6. #6
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    Je cherche à le faire sans les templates, pour bien comprendre les méthodes et les attributs que l'on met dans une classe vecteur, et après je passerai aux templates.
    Peux tu m'aider stp à avoir un exemple qui crée une classe de vecteur et un code qui fait la somme de deux vecteurs et la multiplication d'un scalaire par un vecteur? Svp.

  7. #7
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    S'il te plait, donc on écrit un seul fichier main.cpp où l'on met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    #include<valarray>4
     
    using namespace std;
     
    int main()
     
    {
     
    valarray<double> A(n);
     
    valarray<double>B(?);
     
    valarray<double> C=A+B;
     
    return 0;
     
    }
    Ma question est que si A et B sont des vecteurs à n composantes, qu'est ce qu'il faut ajouter dans le programme? et aussi comment utiliser cout et cin ici, pour afficher et faire rentrer les composantes des vecteurs A et B? S'il te plaît, et merci d'avance.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Points : 44
    Points
    44
    Par défaut
    Bon, là, je pense qu'il vaut mieux commencer par un cours C++ et se documenter un peu.

    Ou sinon un bon livre C++, voir la section sur devp.

    Et sinon, oui, beaucoup de ressources sont en anglais, mais dans ce domaine d'activité, l'anglais est INCONTOURNABLE. Donc il va falloir s'y mettre...
    Bon courage !

    Citation Envoyé par hinaneee Voir le message
    S'il vous plaît, vous avez utilisé
    std::vector<double> _data;

    1- qui est data? c'est un fichier qui contient les données? Comment organiser ces données, et doit-on mettre un include quelque part?
    2- Pour les constructeur, pouvez vous m'en dire un peu plus svp? Pourquoi il y'en a plusieurs et qu'est ce qu'ils font?
    3- avez vous un cours en français qui donne un exemple détaillé sur comment construire une classe de vecteur proprement pour comprendre? dans c++11 rai il n'y en a qu'en anglais.
    Merci beaucoup.

  9. #9
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    Alors voilà, j'essaye d'écrire un programme qui fait la somme de vecteur, et le produit d'un scalaire par un vecteur, en utilisant les classes. J'ai compris qu'il existe deux méthodes: une méthode en utilisant les opérateurs de surcharge, et une méthode qui utilise les templates.

    Méthode 1:

    fichier.h


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Vecteur
    {
    private:
    int N;//taille du vecteur
    double *v;//pointer les composantes
     
    public:
    Vecteur();//constructeur par défaut
    Vecteur(int i);//constructeur avec taille
    ???
    }
    1- Comment déclarer un constructeur de copies? j'ai vu plusieurs livres et je suis perdue, quelle est la déclaration, en générale?

    2- Comment implémenter les 3 constructeurs? et le destructeurs? (expression générale qu'on utiise quel que soit le problème), et comment déclarer et implémenter les opérateurs + et mulutiplication par un scalaire?

    Méthode 2: en utilisant la bibliothèque valarray

    on garde l'ancier fichier Vecteur.h mais dans cette méthode, on n'a pas besoin d'implémenter les opérateurs d'addition et de multiplication, et on obtient le fichier Vecteur.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #include "Vecteur.h"
    #include <Valarray"
    using namespace std;
    int main()
    {
    valarray<int> A(4);
    valarray<int> B(4);
    std::cout<< A=<<endl;
    std::cin>>A;
    std::cout<< B=<<endl;
    std::cin>>B;
    valarray<int> C=A+B;
    valarray<int> D=\lambda * A;
    return 0;
    }
    Mais il ne faudrait pas préciser que A et B sont des éléments de la classe Vecteur, et que lambda est un scalaire? Comment faire s'il vous plaît.

    Je vous remercie par avance de m'aider.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Vive le multipost... http://www.developpez.net/forums/d15...cpp/class-cpp/
    Commence par apprendre les bases du langage par exemple dans un cours C++.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    Bon, corrigez moi si je me trompe, mais si on utilise la classe valarray, on n'a plus besoin de créer un fichier.h

    J'ai écrit le code suivant:

    Vecteur.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #include<iostream>
    #include<valarray>
    using namespace std;
    main()
    {
    valarray<double> A(4), B(4), D(4)
    int i;
    for(i=1;i<=4;i++)
    cout<<A(i)=;
    cin>>A(i);
    cout<<B(i)=;
    cin>>B(i);
    }
    D=A+B;
    }
    et là il me dit qu'il ne connait pas le i. Comment le corriger s'il vous plaît?

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Si tu écrivais ton code plus proprement tu remarquerais que tu n'as pas mis l'accolade ouvrante sur le for..
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  13. #13
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    je pense que la classe valarray en fait n'a pas les opérateur =, +, et *. D'où ma question:

    1- Alors à quoi sert d'inclure la classe valarray?

    2- J'ai réecris le code, et le voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Vecteur & operator + (const Vecteur &);
    {
      valarray<double> A,B,C;
      for(i=0;i<=N;i++)
        {
          D[i]=A[i]+B[i]
    	}
    }
    main()
    {
      int i=0;
      valarray<double> A [i], B [i], D [i]
        for(i=0;i<=4;i++)
          {
    	cout <<" A[i]"=<<endl;
    	cin>>A[i];
           	cout <<" B[i]"=<<endl;
    	cin>>B[i];
          }
      D=A+B;//D(i)=A(i)+B(i) pour i de 1 à 4
     
    }
    et il m'envoie l'erreur suivante:

    Vecteur.cpp:4:1: error: ‘Vecteur’ does not name a type
    Vecteur & operator = (const Vecteur &);
    ^
    Vecteur.cpp:5:1: error: ‘Vecteur’ does not name a type
    Vecteur & operator = (const Vecteur &);
    ^
    Vecteur.cpp:6:1: error: ‘Vecteur’ does not name a type
    Vecteur & operator + (const Vecteur &);
    ^
    Vecteur.cpp:7:1: error: expected unqualified-id before ‘{’ token
    {
    ^

    Il veut dire que je n'ai pas défini les opéraur = et +.

    Mon problème est: comment définir l'opérateur = pour les vecteurs? et comment aranger ma définition de l'opérateur +? S'il vous plaît.

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  15. #15
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    Ok. Tu veux m'aider à éclaircir quelques points s'il te plaît.
    1-
    la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      int init[]={10,20,30,40};
    que signifie l'écriture init[] avec les crochet vide?
    2- la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::valarray<int> foo (init,4);
    pourquoi foo a deux arguments?
    Merci d'avance.

  16. #16
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    Il est vraiment temps de revoir les bases de la programmation C++.

    La notation int init[] est la déclaration d'un tableau statique à dimension non définie. Il faut donc définir son contenu à la construction, afin que cette dimension soit définie.
    Pour la deuxième question, un coup d'oeil au constructeur de std::valarray te permettra d'avoir la réponse.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  17. #17
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    Salut,
    ce que j'ai écrit dans mon précédent poste, c'est un copier-coller d'un exemple que j'ai trouvé sur les valarray. Bon, j'ai laissé tombé et j'ai ré-écris la classe.
    Voici mon header:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
    #include<iostream>
    using namespace std;
    class vecteur
    {
     private:
      int n;//taille
      double *v;//pointer les composantes
     public:
     vecteur():v(NULL),n(0){};//Déclaration et définition du constructeur par défaut
      vecteur(int n);//déclaration d'un constructeur avec argument
      vecteur(vecteur const& v);//déclaration d'un constructeur de copie
      ~vecteur();//déstructeur
      double composante(int i);// Déclaration d'une fonction pour définir les composantes du vecteur
      void affiche();//déclaration de la fonction affiche
    };
    et voici le .cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
     
    #include <iostream>
    #include "exemple.h"
    using namespace std;
    //Définition du constructeur de copie
    vecteur::vecteur(const vecteur& ref): n(ref.n)
    {
      v = new double[n];
      for(unsigned int i=0; i<n;i++)
        v[i]=ref.v[i];
    }
    vecteur::vecteur(int n)
    {
      this->n = n;
      v = new double[n];
    }
     
    vecteur::~vecteur()
    {}
     
    double vecteur::composante(int i)
    {
      return v[i];
    }
    main()
    {
      int i;
      vecteur v;
      std::cout<<"v=";cout<<"\n";
      for(i=0;i<4;i++) std::cin>> v.composante(i);   
    }
    et en fait le problème est dans l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     for(i=0;i<4;i++) std::cin>> v.composante(i);
    l'objectif étant de pouvoir rentrer les composante de v (soit composante par composante, ou bien toutes d'un seul coup, et de les afficher). Comment l'aranger? S'il vous plaît. Je vous remercie par avance.

  18. #18
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut classe templates pour vecteur
    Bonjour,
    je cherche à créer une classe vecteur en utilisant les templates, et qui a l'opération du calcul des normes.

    voici mon code pour le moment(sans templates pour le moment):

    fichier.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    #include<iostream>
    class vecteur
    {
     private:
      unsigned int n;//taille
      double *v;//pointer les composantes
     public:
     vecteur():v(NULL),n(0){};//Déclaration et définition du constructeur par défaut
      vecteur(unsigned int nb=0, double val=0);//déclaration d'un constructeur avec argument
      vecteur(vecteur const& v);//déclaration d'un constructeur de copie
      ~vecteur();//déstructeur
      double& operator [] (int rang);//Déclaration de l'opérateur[]
      vecteur& operator = (const vecteur&);//Déclaration de l'opérateur =
      vecteur operator * (double scalar); //Déclaration de l'opérateur *
      vecteur operator + (const vecteur&);//Déclaration de l'opérateur +
      vecteur operator - (const vecteur&);//Déclaration de l'opérateur -
      vecteur operator += (const vecteur&);//Déclaration de l'opérateur +=
      vecteur operator -= (const vecteur&);//Déclaration de l'opérateur -=
      float vecteur:: norme (const vecteur&, unsigned int n);
      void affiche();   
    };
    fichier.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    #include <iostream>
    #include "template.h"
    #include <cmath>
    #include <fstream>
    using namespace std;
    //Définition du constructeur de copie
    vecteur::vecteur(const vecteur& ref): n(ref.n)
    {
      v = new double[n];
      for(unsigned int i=0; i<n;i++)
        v[i]=ref.v[i];
    }
     
    //Définition du constructeur avec argument
    vecteur::vecteur(int nb, double val)
    {
       n = nb;
       if (nb == 0)
          v = NULL; 
       else
       {
          v = new double[n];
          for (unsigned i=0; i<n; i++)
             v[i] = val;
       }
    }
     
    //Définition du destructeur
    vecteur::~vecteur()
    {}
     
    //Définition de []
    double& vecteur::operator[](int rang)
    {
      return v[rang]; 
    }
     
    //Définition de =
     
    vecteur &vecteur::operator=(const vecteur &a)
    {
      for(int i=0;i<n;i++)
        {
          v[i]=a.v[i];
        }
    return *this;
    }
     
     
    //Définition de +
    vecteur vecteur:: operator + (const vecteur &a)
    {
    vecteur d(n);
    for (int i=0;i<n;i++)
    d.v[i]=v[i]+a.v[i];
    return d;
    }
     
    //Définition de *
    vecteur vecteur:: operator*(double  d)
    {
    for(int i=0;i<n;i++)
    v[i]=d*v[i];
    return *this;
    }
     
     
    //Définition de la fonction norma
    float vecteur:: norme (const vecteur&, unsigned int n)
    {
    float p=;
     for (int i=; i<n; i++)
      {
       p=v[i] * v[i] + p;
      }
     return sqrt(p);
    } 
     
     
     
     
    //Déclaration de la fonction affiche
    void vecteur::affiche()
    {
    //cout<<"les coordonnées du vecteurs v sont"<<endl;
    for(int i=0;i<n;i++)
    {
    cout<<v[i]<<endl;
    }
    cout<< "---fin---"<<endl;
    }
     
    int main()
     
    {
     
    return ;
     
    }
    Quelles sont les modification a apportées pour introduire les templates?
    Merci par avance.
    Je vous remercie par avance pour votre aide.

  19. #19
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    D'abord un typedef (public) pour remplacer tous les "double" par "value_type".
    Puis, introduire la template en elle-même pour, remplacant le double du typedef par T (ou Value ou n'importe quel nom)

    Ca donnerait quelque chose comme ceci: (ce n'est pas un vecteur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template <typename T>
    class Bidule {
    public:
        typedef T value_type;
     
    private:
        value_type v;
     
    public:
        Bidule(value_type const& v) : v(v) {}
        value_type value() const {return v;}
    };
    Encore une fois, relis notre faq sur les opérateurs
    Notamment, il faut vraiment que tu définisses les opérateurs non-affectants hors de la classe.
    Du coup, ce seront des templates de fonctions, elles aussi.

    J'avais déjà fais ce travail dans mon premier message
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  20. #20
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    Bonjour,
    tout d'abord, merci d'avoir pris le temps de me répondre. J'ai deux questions s'il vous plaît.
    1- Je lis que quelques templates vecteurs commencent par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <typename Real, int dim>
    class Vector{
       Real data[dim];
    public:
    donc il faut mettre aussi int dim, et le type générique s'appelle Real (dans votre code c'est T). Que signifie la ligne Real data[dim];? S'il vous plaît.
    Je lis aussi que tout ce qui est indice ou dimension, on ne lui mete pas int ou unsigned int, mais size_t, ce n'est pas obligatoire?
    2- Que pensez vous de la fonction norme que j'ai défini? Et comment l'arranger? S'il vous plaît.
    3-Poutquoi utiliser value_type? Normalemrent c'est T qui représente le type générique. Non?
    Je vous remercie par avance.

Discussions similaires

  1. Utilisation des vecteurs
    Par EmilieG dans le forum MFC
    Réponses: 12
    Dernier message: 19/03/2004, 16h28
  2. [math] somme de plusieurs vecteurs à 3 dimensions
    Par teska dans le forum Mathématiques
    Réponses: 5
    Dernier message: 04/06/2003, 21h40
  3. Récuperer les coordonnées d'un vecteur
    Par kerzut dans le forum OpenGL
    Réponses: 5
    Dernier message: 15/04/2003, 11h51
  4. Zoom sur des vecteurs ou lignes
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 25/11/2002, 10h40
  5. matrices * vecteur
    Par delire8 dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 07/09/2002, 14h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo