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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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
    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 [email protected] 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