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 :

Class dans une Class


Sujet :

C++

  1. #21
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Soit en fonction non-membre comme dans mon précédent post, soit en fonction membre comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <class T> Vector
    {
       // ...
     
       template <class U> Vector<T> operator *(const U& u);
    };
    Et bien sûr tu n'as plus besoin de SVector et de toutes ces "bidouilles".

    A noter que tu peux avoir des difficultés avec ce genre de code, si tu compiles avec VC6. Dans ce cas, prendre la version non-membre peut régler un éventuel problème de compilation.

  2. #22
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 24
    Points : 29
    Points
    29
    Par défaut
    je verrais ca comme ca ...
    (d'apres ce que j'ai compris que tu voulais)

    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
     
    #include <vector>
    #include <algorithm>
     
    template<typename T>
    class Vector : public std::vector<T> // pour l'exemple, apres faudrait encapsuler proprement
    {
    	template <typename Type>
    	class MultValue
    	{
    	private:
    		Type Factor;
    	public:
    		MultValue ( const Type& _Val )
    			: Factor ( _Val )
    		{
    		}
     
    		int operator ( ) ( Type& elem ) const 
    		{
    			return elem * Factor;
    		}
    	};
     
    public:
     
    	template<typename Param>
    	Vector<T> operator * (const Param & p)
    	{
    		Vector<T> r;
    		r.reserve(size());
    		std::transform(begin(), end(), r.begin(), MultValue<Param>(p));
    		return r;
    	}
    };
     
    int main()
    {
    	Vector<int> v, w;
    	w = v*3;
     
    }

  3. #23
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut
    en effet j ai une version VC6
    ce qui explique que ca ne compile pas
    c est pourquoi j ai pense a ce strategeme

    Citation Envoyé par Loulou24
    Soit en fonction non-membre comme dans mon précédent post, soit en fonction membre comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <class T> Vector
    {
       // ...
     
       template <class U> Vector<T> operator *(const U& u);
    };
    Et bien sûr tu n'as plus besoin de SVector et de toutes ces "bidouilles".

    A noter que tu peux avoir des difficultés avec ce genre de code, si tu compiles avec VC6. Dans ce cas, prendre la version non-membre peut régler un éventuel problème de compilation.

  4. #24
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    [pinaillage]

    Je pense que MultValue::operator () devrait renvoyer un T plutôt qu'un int, non ?

    Sinon pour la multiplication à moindre frais (en terme de lignes de code), je pense qu'on peut s'en tirer avec un std::multiplies et un std::bind2nd, par exemple.

    EDIT : Ton opérateur va crasher je pense, il faut soit utiliser resize au lieu de reserve, soit utiliser un back_inserter.

    [/pinaillage]

  5. #25
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En théorie VC6 n'aime pas les fonctions membres templates de classes templates. En pratique, si tu ne sépares pas la définition de la déclaration, ça devrait compiler. Sinon, comme je l'ai dit le fait de faire de tes opérateurs des fonctions non-membres devrait passer sans problème.

  6. #26
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    ...Et à noter aussi que pour avoir des vecteurs "mathématiques" il existe la classe std::valarray, qui permet entre autres d'effectuer ce genre d'opération.

    Par contre je n'arrive pas à la trouver dans mes docs de référence, est-elle bien standard ?

  7. #27
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    std::valarray est standard. Par contre son implémentation efficace est récente. (oubliez VC6)
    Je préfère lorgner du côté de Blitz++ et à termes de boost::ublas.

    Les opérations sur des vecteurs se portent beaucoup mieux quand elles sont non membres. Cela permet d'avoir des opérations véritablement commutatives et qui supportent les cast implicites -- en rendant la fonction membre template, ce n'est plus forcément utile.

    (Sinon un code compliqué que je n'ai pas cherché à approfondir.)

  8. #28
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 24
    Points : 29
    Points
    29
    Par défaut
    Loulou24
    =>
    en effet on peut remplacer class MultValue par std::multiplies, je ne conaissais pas ...

    pour l'erreur du int, c'est parce que j'ai recopié betement mon exemple des MSDN qui faisait exactement cela, mais qui contenait aussi cette erreur.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Eval d'une propriété d'une classe dans une classe
    Par bizet dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/10/2008, 09h43
  2. Créer une classe dans une classe
    Par FabaCoeur dans le forum C++
    Réponses: 9
    Dernier message: 02/06/2007, 20h26
  3. [POO] Une Classe dans une Classe. C'est possible?
    Par FrankOVD dans le forum Langage
    Réponses: 2
    Dernier message: 18/05/2006, 22h02
  4. [POO] Utilisation d'une classe dans une classe !
    Par Okinou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 14h34
  5. Une classe dans une classe...
    Par Baquardie dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/09/2005, 19h36

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