Warum lässt mich der Compiler kein typedef weiterleiten?
Angenommen, es ist unmöglich, was ist die beste Vorgehensweise, um meinen Einschlussbaum klein zu halten?
c++
typedef
forward-declaration
user96825
quelle
quelle
typedef
Namen beispielsweise einen komplexen mehrstufigen Vorlagentyp verwenden, der eine Vorwärtsdeklaration verwendet, ist dies auf diese Weise ziemlich komplex und schwierig. Ganz zu schweigen davon, dass möglicherweise Implementierungsdetails erforderlich sind, die in Standardvorlagenargumenten versteckt sind. Und die Endlösung ist ein langwieriger und unlesbarer Code (insbesondere wenn Typen aus verschiedenen Namespaces stammen), der sehr anfällig für Änderungen des ursprünglichen Typs ist.Für diejenigen unter Ihnen wie mich, die eine mit typedef definierte C-artige Struktur in einem C ++ - Code deklarieren möchten, habe ich eine Lösung gefunden, die wie folgt lautet ...
quelle
Um "fwd einen Typedef deklarieren" zu können, müssen Sie eine Klasse oder eine Struktur fwd deklarieren, und dann können Sie den deklarierten Typedef eingeben. Mehrere identische Typedefs werden vom Compiler akzeptiert.
lange Form:
Kurzform:
quelle
In C ++ (aber nicht in einfachem C) ist es völlig legal, einen Typ zweimal zu tippen, solange beide Definitionen vollständig identisch sind:
quelle
A
Felder auf diese Weise, da sieA
per Definition leer sind?Denn um einen Typ zu deklarieren, muss seine Größe bekannt sein. Sie können einen Zeiger auf den Typ weiterleiten oder einen Zeiger auf den Typ eingeben.
Wenn Sie wirklich wollen, können Sie die Pimpl-Sprache verwenden, um die Includes niedrig zu halten. Wenn Sie jedoch einen Typ anstelle eines Zeigers verwenden möchten, muss der Compiler seine Größe kennen.
Bearbeiten: j_random_hacker fügt dieser Antwort eine wichtige Qualifikation hinzu. Grundsätzlich muss die Größe bekannt sein, um den Typ verwenden zu können. Eine Vorwärtsdeklaration kann jedoch erfolgen, wenn nur bekannt sein muss, dass der Typ vorhanden ist , um Zeiger oder Verweise auf den Typ zu erstellen Art. Da die OP nicht Code zeigen tat, aber beschwerte sich wäre es nicht kompilieren, ging ich davon aus (wahrscheinlich richtig) , dass die OP versuchte , verwenden Sie die Art, nicht nur darauf verweisen.
quelle
Die Verwendung von Vorwärtsdeklarationen anstelle eines vollständigen
#include
s ist nur möglich, wenn Sie nicht beabsichtigen, den Typ selbst (im Bereich dieser Datei), sondern einen Zeiger oder Verweis darauf zu verwenden.Um den Typ selbst verwenden zu können, muss der Compiler seine Größe kennen - daher muss seine vollständige Deklaration gesehen werden - daher ist eine vollständige Deklaration
#include
erforderlich.Die Größe eines Zeigers oder einer Referenz ist dem Compiler jedoch unabhängig von der Größe des Pointees bekannt, sodass eine Vorwärtsdeklaration ausreichend ist - sie deklariert einen Typkennungsnamen.
Interessanterweise kann der Compiler bei Verwendung von Zeigern oder Verweisen auf
class
oderstruct
Typen unvollständige Typen verarbeiten , sodass Sie die Pointee-Typen nicht weiter deklarieren müssen:quelle
Ich hatte das gleiche Problem, wollte mich nicht mit mehreren Typedefs in verschiedenen Dateien herumschlagen, also habe ich es mit Vererbung gelöst:
war:
tat:
Lief wie am Schnürchen. Natürlich musste ich alle Referenzen von ändern
zu einfach
quelle
Ich habe die
typedef
(using
um genau zu sein) durch Vererbung und Konstruktorvererbung (?) Ersetzt .Original
Ersetzt
Auf diese Weise konnte ich deklarieren
CallStack
mit:quelle
Wie Bill Kotsias bemerkte, ist die einzige vernünftige Möglichkeit, die typedef-Details Ihres Punktes privat zu halten und sie weiterzuleiten, die Vererbung. Mit C ++ 11 können Sie es allerdings etwas besser machen. Bedenken Sie:
quelle
Wie @BillKotsias habe ich Vererbung verwendet, und es hat bei mir funktioniert.
Ich habe dieses Durcheinander geändert (für das alle Boost-Header in meiner Deklaration * .h erforderlich waren).
in diese Erklärung (* .h)
und die Implementierung (* .cpp) war
quelle