Je n'ai rien trouvé de pertinent, mais désolé si cela a déjà été demandé. Je me trouve parfois dans une situation dans laquelle j'ai une classe, qui contient intérieurement deux récipients différents. Quelque chose comme le suivant:C++: Conception de l'interface d'une classe contenant de nombreux conteneurs
class Foo
{
public:
typedef std::vector<int> int_list;
typedef std::vector<X> x_list;
// It would be nice if the user could iterate through these etc. so that I
// could define functions that operate on them as non-member non-friends.
typedef int_list::size_type int_list_size_type;
typedef int_list::const_iterator int_list_const_iter;
typedef x_list::size_type x_list_size_type;
typedef x_list::const_iterator x_list_const_iter;
int_list_const_iter int_list begin() const { return ints_.begin(); }
x_list_const_iter begin() const { return xs_.begin(); }
int_list::size_type size_of_ints() const { return ints_.size(); }
x_list::size_type size_of_xs() const { return xs_.size(); }
// And so forth ... !
private:
int_list ints_;
x_list xs_;
};
D'une certaine façon, je me sens mal à l'aise. Est-ce une façon intelligente de faire ce que je fais? Fondamentalement, pour chaque conteneur, je voudrais typedefs et (const surchargé) méthodes de début et de fin, etc Je suis curieux: quelle serait votre façon de concevoir l'interface, nommant le typedefs etc? Je suppose que je suis fondamentalement inquiet à propos de l'interface et de l'explosion des méthodes, et ça a l'air un peu moche aussi. Peut-être une façon de limiter le nombre de méthodes de début/fin serait une approche basée sur un modèle en utilisant un peu de balises, mais je ne suis pas sûr que ce soit raisonnable.
Merci!
Au contraire, je dirais. La classe ne fait pas ASSEZ, si toutes les opérations sur les internes se passent via. code client. –
+1 à la fois à la réponse et au commentaire: cela ressemble à un terrain d'entente inconfortable entre permettre aux clients de faire ce qu'ils veulent et assurer une sorte d'état cohérent entre les conteneurs. – suszterpatt
@Noah Roberts: C'est un bon point. –