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 :

templates et smart pointers [Infos]


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Par défaut templates et smart pointers
    salut !

    J'ai suivi vos indications et essaye de me mettre aux smart_pointers.
    Ca a l'air efficace... mais je ne peux les tester !

    J'ai donc developpé la classe suivante (pour m'entrainer) :
    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
     
    #include "stdafx.h"
     
     
    #ifndef __SMART_PTR_CLASS__
    #define __SMART_PTR_CLASS__
     
     
    template< class T >
    class PTR
    {
    private:
    	T* m_Ptr;
     
    public:
    	explicit PTR(T* Value);
    	virtual ~PTR();
     
    	void Show();
     
    	T* operator ->() { return m_Ptr; }
        T& operator *() { return *m_Ptr; }
     
    };
     
     
    #endif
    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
     
    template< class T > PTR<T>::PTR(T* Value):m_Ptr(NULL)
    {
     if( Value )
    	m_Ptr = Value;
    }
     
     
    template< class T > PTR<T>::~PTR()
    {
     if( m_Ptr )
    	 delete m_Ptr;
    }
     
     
    template< class T > void PTR<T>::Show()
    {
     if( m_Ptr )
      cout << m_Ptr << endl;
    }
    ca compile trés bien.
    Cependant, dans le fichier main, si je met n'importe quoi en relation avec ma classe, j'obtient des erreurs linker !!!
    De plus, dans l'arborescence de VC++ pour les classes : si je dbl-clk sur la methode Show, ile me dit qu'il ne peut m'y emmener puisque la methode n'est pas implémentée !

    voici mon code sdans 'main"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    #include "stdafx.h"
    #include "smart_ptr.h"
     
    int main(int argc, char* argv[])
    {
    	PTR<int> p = PTR<int>(new int);
     
    	return 0;
    }
    il me jette a la figure les erreur suivantes :
    Citation Envoyé par VC++
    smart.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall PTR<int>::~PTR<int>(void)" (??1?$PTR@H@@UAE@XZ)
    smart.obj : error LNK2001: unresolved external symbol "public: __thiscall PTR<int>:TR<int>(int *)" (??0?$PTR@H@@QAE@PAH@Z)
    D
    Et question subsidiaire : je construie mon objet. Mais si par defaut je veux lui donner la valeur "n",commet je dois faire, puisque la je dit dans le Ctor "new int" ??

    merci

  2. #2
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 21
    Par défaut
    toutes les définitions de fonctions template se font dans le .h . donc mets
    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
     
    template< class T > PTR<T>::PTR(T* Value):m_Ptr(NULL) 
    { 
    if( Value ) 
       m_Ptr = Value; 
    } 
     
     
    template< class T > PTR<T>::~PTR() 
    { 
    if( m_Ptr ) 
        delete m_Ptr; 
    } 
     
     
    template< class T > void PTR<T>::Show() 
    { 
    if( m_Ptr ) 
      cout << m_Ptr << endl; 
    }
    dans ton .h

    ensuite si tu veux initialiser ton int avec la valeur n, il te suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PTR<int> p(new int(n));
    si tu veux, j'ai plusieurs smart pointers que je peux te filer.

  3. #3
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 21
    Par défaut
    de plus, les fonctions ne seront affichées dans le class view que si elles sont définies à l'intérieur de la classe dans le .h

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename T> class A{
    public:
        A  () {...}
        ~A () {...}
    };
    c'est microsoft, faut pas pousser!

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Par défaut
    Merci, ca marche trés bien... mais c'est pas normal que ca ne marche aps si je definit mes fonctions ailleurs que dans le header : je fais ca pour toutes mes classes d'habitude : un header et un cpp.

    M'enfin, spa grave.

    Sinon, c'est gentil de proposer tes smart pointers, envoie les moi a charles_reso@yahoo.fr stp.

    merci.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Par défaut
    merci beaucoup pour le document.
    Cependant, j'essaye de mon coté et j'obtiens des erreurs de compilation au niveau de l'operateur "->"

    C:\Documents and Settings\Administrateur\Bureau\smart\smart.cpp(16) : error C2839: invalid return type 'int *' for overloaded 'operator ->'
    C:\Documents and Settings\Administrateur\Bureau\smart\smart.cpp(16) : error C2227: left of '->Show' must point to class/struct/union
    pour le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #define N_PTR(type,var,value) PTR<type> var = PTR<type>(new type(value));
     
    int main(int argc, char* argv[])
    {
    	printf("Hello World!\n");
     
    	//PTR<int> p = PTR<int>(new int(12));
    	N_PTR(int,p,12);
     
    	p->Show();
    Ce que je ne comprend pas, c'est que les codes que j'ai telechargé compilent bien, alros qu'il sont pareil !!
    Enfin, visiblement non.

    merci

  6. #6
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 21
    Par défaut
    montre l'ensemble de ton code, en particulier celui de l'opérateur ->
    (smart.cpp c'est le fichier où tu as ton main?)

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Par défaut
    L'ensemble de mon code ??
    Eh bien il est deja posté ;p
    Mais je te recapitule tout :

    smart.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
     
    // smart.cpp : Defines the entry point for the console application.
    //
     
    #include "stdafx.h"
    #include "smart_ptr.h"
     
    #define N_PTR(type,var,value) PTR<type> var = PTR<type>(new type(value));
     
    int main(int argc, char* argv[])
    {
    	printf("Hello World!\n");
     
    	//PTR<int> p = PTR<int>(new int(12));
    	N_PTR(int,p,12);
     
    	p->Show();
     
    	return 0;
    }
    smart_ptr.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
    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
     
    #include <iostream>
    #include <stdlib.h>
    #include "stdafx.h"
     
    #ifndef __SMART_PTR_CLASS__
    #define __SMART_PTR_CLASS__
     
     
    template< class T >
    class PTR
    {
    private:
    	T* m_Ptr;
     
    public:
    	explicit PTR(T* Value);
    	virtual ~PTR();
     
    	void Show();
     
    	T* operator ->() { return m_Ptr; }
        T& operator *() { return (*m_Ptr); }
     
    };
     
     
    template< class T > PTR<T>::PTR(T* Value):m_Ptr(NULL)
    {
     if( Value )
    	m_Ptr = Value;
    }
     
     
    template< class T > PTR<T>::~PTR()
    {
     if( m_Ptr )
    	 delete m_Ptr;
    }
     
     
    template< class T > void PTR<T>::Show()
    {
     if( m_Ptr )
      cout << m_Ptr << endl;
    }
     
     
    #endif
    cordialement

  8. #8
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 21
    Par défaut
    :trouve:
    en fait tu t'es laissé avoir par l'erreur classique pour les smart pointers (c'est d'ailleurs pourqoui il ne vaut mieux pas mettre d'autres méthodes que des opérateurs, constructeurs, destructeur pour les classes de smart pointers).

    tu as fais -> à la place de .
    car si tu fais -> tu renvoies un int* et le type int ne dispose pas de la méthode Show !

    donc fais plûtot
    cordialement aussi.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Par défaut
    Héhé, j'ai déjà essayé
    et ca me donne :
    smart.cpp
    c:\documents and settings\administrateur\bureau\smart\smart_ptr.h(44) : error C2065: 'cout' : undeclared identifier
    c:\program files\microsoft visual studio\vc98\include\xmemory(59) : while compiling class-template member function 'void __thiscall PTR<int>::Show(void)'
    c:\documents and settings\administrateur\bureau\smart\smart_ptr.h(44) : error C2297: '<<' : illegal, right operand has type 'int *'
    c:\program files\microsoft visual studio\vc98\include\xmemory(59) : while compiling class-template member function 'void __thiscall PTR<int>::Show(void)'
    c:\documents and settings\administrateur\bureau\smart\smart_ptr.h(44) : error C2065: 'endl' : undeclared identifier
    c:\program files\microsoft visual studio\vc98\include\xmemory(59) : while compiling class-template member function 'void __thiscall PTR<int>::Show(void)'
    Humm.... de quoi avoir envie de continuer ac les smart_pointers.....

  10. #10
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 21
    Par défaut

    il faut inclure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include <iostream>
    using namespace std;
    dans ton code.
    ça devrait déjà t'enlever quelques erreurs. si il y en a d'autres, poste les.

Discussions similaires

  1. Template, Smart Pointer et Valeur par défaut
    Par oxyde356 dans le forum Langage
    Réponses: 10
    Dernier message: 22/03/2011, 23h08
  2. [template] un smart pointer parmi d'autres
    Par camboui dans le forum C++
    Réponses: 47
    Dernier message: 05/12/2008, 10h33
  3. Boost & smart pointers
    Par Goduak dans le forum Boost
    Réponses: 5
    Dernier message: 28/02/2008, 10h41
  4. Smart Pointer
    Par Fry dans le forum C++
    Réponses: 5
    Dernier message: 03/10/2005, 23h13
  5. Utilisation des smart pointer
    Par 0xYg3n3 dans le forum MFC
    Réponses: 11
    Dernier message: 22/04/2005, 18h37

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