Es ist eine lange Zeit seit meiner letzten Verwendung von C ++, von Java und Python zurückkommen, habe ich eine Frage über gute Praktiken auf C ++:
Ich wollte einen semantischen Code über einige wirklich einfache Objekte behalten, sagen wir, wir haben Objekte Tag und File, die beide nur std :: string sind und eine Klasse TagManager, die verschiedene Funktionen mit Tags und Dateien enthält.
Meine Frage ist, ist es besser, einen benutzerdefinierten Typ zu erstellen, der diese trivialen Objekte darstellt oder sie direkt für das zu verwenden, was sie sind?
Um genauer zu sein, könnte ich eine dieser Definitionen für eine Funktion haben:
%Vor%Ich bevorzuge die erste Lösung, weil ich gerne einen semantischen Code aufbewahre, andererseits muss der Benutzer überprüfen, was diese Typen sind, und so die Einfachheit der Verwendung reduzieren.
Ich lese auch auf eine andere Frage ( Du sollst nicht von std :: vector
Was machst du in einer solchen Situation? Was empfiehlt die C ++ - Philosophie?
Normalerweise verwende ich typedef
s in solchen Fällen:
typedef
s keine neuen Typen oder unangenehmen Ableitungen von std::vector<>
selbst einführen, können die Aliase dennoch für die Benutzer, die Ihren Code verwenden, möglicherweise lästige Abwege sein. std::string
-Features in Ihrem speziellen Fall nicht verwendet werden oder in dem Ersatz bereitgestellt werden). typedef
später geändert werden, um eine neue Klasse mit zusätzlichen Eigenschaften und Funktionen zu aliasieren oder nur für den Typ Sicherheit. Es nennt sich encapsulation (auch bekannt als Data Hiding). Wenn man das Konzept von File
und a Tag
verkapselt, fügt man Wert hinzu, dann mach weiter und tu es, sonst fügst du nur Komplexität hinzu. Es könnte sein, dass Sie später std::wstring
anstelle eines einfachen std::string
intern in den Klassen verwenden, was Sie leicht ändern können, wenn Sie die Klassen Tag
und File
und die Benutzer der Klassen am wahrscheinlichsten erstellen wird nicht beeinflusst.
Was das Erben von std :: vector anbelangt, ist das in der Tat etwas, das Sie vermeiden sollten. Aber denken Sie daran: Erben und Kapselung sind zwei völlig verschiedene Konzepte.
Da ich der Typ Freak bin, schließe ich immer neue Typen ein.
Das Schreiben des Wrapper-Codes ist einfach:
%Vor%Und das ist es!
typedef
sind nett und alle, aber es ist zu einfach, sie zu mischen und Operationen zu verwenden, die keinen Sinn ergeben: Was bedeutet Tag::substr
?
Es gibt einige gültige Anwendungsfälle für (einfache) Wrapping-Typen:
Für jeden Umbruch würden Sie eine eigene Klasse (Vorlage) erstellen, um die Typsicherheit zu gewährleisten. Ein einfacher Typdef würde nichts einkapseln, sondern nur die Verwendung verdeutlichen.
Tags und Links c++