Ich konnte nichts relevantes finden, aber es tut mir leid, wenn dies bereits gefragt wurde. Ich finde mich manchmal in einer Situation wieder, in der ich eine Klasse habe, die intern zwei verschiedene Container enthält. So etwas wie das Folgende:C++: Entwerfen der Schnittstelle einer Klasse mit vielen Containern
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_;
};
Irgendwie fühle ich mich unwohl. Ist das eine kluge Art zu tun, was ich mache? Im Grunde müsste ich für jeden Container typedefs und (const overloaded) Methoden starten und beenden. Ich bin gespannt: Wie würden Sie die Schnittstelle gestalten, die Typdefinitionen benennen usw.? Ich denke, ich bin im Grunde besorgt über die Schnittstelle und die Explosion der Methoden, und es sieht auch ein bisschen hässlich aus.
Eine Möglichkeit, die Anzahl der Anfangs-/Ende-Methoden zu begrenzen, wäre ein Template-basierter Ansatz, der einige Arten von Tags verwendet, aber ich bin mir nicht sicher, ob das sinnvoll ist.
Danke!
Ganz im Gegenteil, würde ich sagen. Die Klasse tut nicht GENUG, wenn alle Operationen auf den Interna über passieren. Client-Code. –
+1 sowohl auf die Antwort als auch auf den Kommentar: Dies sieht wie ein peinlicher Mittelweg aus, zwischen Clients zu erlauben, zu tun, was sie wollen, und einen gewissen konsistenten Zustand zwischen den Containern sicherzustellen. – suszterpatt
@Noah Roberts: Das ist ein guter Punkt. –