Nur um einige Beispiele für die genannten Dinge zu nennen: STL-Container.
typedef std::map<int,Froboz> tFrobozMap;
tFrobozMap frobozzes;
...
for(tFrobozMap::iterator it=frobozzes.begin(); it!=map.end(); ++it)
{
...
}
Es ist nicht ungewöhnlich, auch nur typedefs wie zu verwenden
typedef tFrobozMap::iterator tFrobozMapIter;
typedef tFrobozMap::const_iterator tFrobozMapCIter;
Ein weiteres Beispiel: Verwenden gemeinsamer Zeiger:
class Froboz;
typedef boost::shared_ptr<Froboz> FrobozPtr;
[Update] Laut Kommentar - wo sollen sie abgelegt werden?
Das letzte Beispiel - Verwenden shared_ptr
- ist einfach: Sind echtes Header-Material - oder zumindest ein Forward-Header. Sie benötigen die Vorwärtsdeklaration für shared_ptr ohnehin, und einer der deklarierten Vorteile besteht darin, dass die Verwendung mit einer Vorwärtsdeklaration sicher ist.
Anders ausgedrückt: Wenn es einen shared_ptr gibt, sollten Sie den Typ wahrscheinlich nur über einen shared_ptr verwenden, sodass das Trennen der Deklarationen wenig Sinn macht.
(Ja, xyzfwd.h ist ein Schmerz. Ich würde sie nur in Hotspots verwenden - in dem Wissen, dass Hotspots schwer zu identifizieren sind. Beschuldigen Sie das C ++ - Kompilierungs- + Linkmodell ...)
Containertypedefs verwende ich normalerweise dort, wo die Containervariable deklariert ist - z. B. lokal für eine lokale Variable, als Klassenmitglieder, wenn die tatsächliche Containerinstanz ein Klassenmitglied ist. Dies funktioniert gut, wenn der tatsächliche Containertyp ein Implementierungsdetail ist und keine zusätzliche Abhängigkeit verursacht.
Wenn sie Teil einer bestimmten Schnittstelle werden, werden sie zusammen mit der Schnittstelle deklariert, mit der sie verwendet werden, z
#include "Froboz.h"
typedef std::map<int, Froboz> tFrobozMap;
void Mangle(tFrobozMap const & frobozzes);
Dies wird problematisch, wenn der Typ ein Bindungselement zwischen verschiedenen Schnittstellen ist - dh der gleiche Typ wird von mehreren Headern benötigt. Einige Lösungen:
- deklarieren Sie es zusammen mit dem enthaltenen Typ (geeignet für Container, die häufig für diesen Typ verwendet werden)
- Verschieben Sie sie in einen separaten Header
- Wechseln Sie zu einem separaten Header und machen Sie ihn zu einer Datenklasse, in der der eigentliche Container wieder ein Implementierungsdetail ist
Ich bin damit einverstanden, dass die beiden letzteren nicht so toll sind, ich würde sie nur verwenden, wenn ich in Schwierigkeiten gerate (nicht proaktiv).