2009-10-31 4 views
1

Considérons que l'un d'entre eux possède des types définis par l'utilisateur et des conteneurs de ces types souvent manipulés, car il existe souvent plusieurs instances de ces types sur l'écran à la fois.Où placer des conteneurs de types définis par l'utilisateur?

Actuellement, j'ai un en-tête avec un fichier source associé et un espace de noms pour contenir ces conteneurs, mais devrais-je créer une classe séparée pour les contenir? Dois-je placer les conteneurs dans le même fichier d'en-tête que la classe qu'ils contiennent (mais évidemment en dehors de la classe)? Quelle est la pratique standard pour des situations comme celle-ci?

Répondre

2

Je les ai typé une fois lorsqu'une classe spécifique a le conteneur comme partie de l'interface de cette classe. Alors n'importe qui qui a eu besoin d'utiliser cette classe a facilement compris qu'un "FooVec" est un vecteur std :: de Foo sans beaucoup de fusible.

Cependant, ceci est une solution imparfaite, considérez le code suivant:

namespace bar 
{ 

    typedef std::vector<Foo> FooVec; 

    class CClass 
    { 
     CClass(FooVec&) 
     { 
      ... 
     } 
    }; 
} 

Naturellement, le problème vient quand votre collègue redéfinit FooVec pour leur classe:

namespace bar 
{ 

typedef std::vector<const Foo> FooVec; 

class CAnotherClass 
{ 
    CAnotherClass(FooVec&) 
    { 
     ... 
    } 
} 

}; 

La chose la plus simple je Nous avons trouvé que résoudre ceci est de les inclure dans un espace commun par espace de noms/bibliothèque/groupe de classes associées. Ainsi, quand quelqu'un d'autre ajoute un typedef à quelque chose dans l'espace de nom de barre, vous pouvez les avoir tous dans un endroit. IE:

barTypes.h 

namespace bar 
{ 
     typedef std::vector<Foo> FooVec; 
     typedef std::vector<const Foo> FooConstVec; 

} 

En gardant à l'un en-tête par petit ensemble de classes (ie par espace de nom) vous ne recevez pas un fichier gigantesque plein de typedefs. Il donne toujours à vos utilisateurs une bonne visibilité sur les types qui font partie de l'interface de votre classe. Une fois que cet en-tête est établi, il suffit de maintenir la discipline sur votre équipe pour l'utiliser au lieu d'établir des typedefs supplémentaires. Peut également souhaiter avoir cet en-tête dans le cadre d'un precompiled header si vous êtes anale sur la performance de construction.

+0

La deuxième partie que vous avez dite est essentiellement ce que j'ai fait. Merci pour l'info. Une autre question sans rapport, les constantes globales et les variables de classe (invariants)? Je suppose que les variables de classe sont préférées, mais ai-je raison dans cette hypothèse? – trikker

+0

Son préféré (par moi) pour limiter la valeur à la portée la plus basse nécessaire. IE si son utilisé uniquement dans une fonction, juste cette fonction. Si c'est utilisé dans une classe, il suffit de le définir pour cette classe. Etc... –

Questions connexes