2009-08-23 8 views
5

Muss ich drei Aussagen wirklich, dh wie dieseVorwärts-Deklaration Vorlage Zeiger

class A; 
template<class _T> class B; 
typedef B<A> C; 

auf einen Zeiger von Vorlagentyp C, wie so zukunfts erklären:

C* c = 0; 

Ich hatte gehofft, zu in der Lage sein, die Klassen A und B in meiner Vorwärtsdeklaration zu verbergen, ist das überhaupt möglich?

+0

Und Litb 2-Zeilen-Methode ist ein bisschen weniger einfach. – rlbond

+0

@rlbond, zog zu einer Antwort und entfernte die 2-Zeilen-Grusel-Code –

Antwort

8

Obwohl nicht genau die gleiche, können Sie dies stattdessen tun könnten:

class C; 
C* c = 0; 

und dann später in der Implementierungsdatei, nachdem die Header-Dateien für " A“und‚B‘aufgenommen worden, definieren‚C‘wie folgt aus:

class C : public B<A> {}; 

Mit Vererbung statt eines typedef arbeiten sollten, wenn Sie nur den Standard-Konstruktor von B <A> verwenden müssen.

+0

EDIT: Sie müssen nicht weiterleiten "A" und "B" in der Implementierungsdatei. Header-Dateien sollten enthalten sein. – Ropez

+0

Nicht, was ich im Sinn hatte, aber ein großer Vorschlag. Vielen Dank! –

+0

Eine wirklich hilfreiche und clevere Lösung, danke @Ropez! – Steed

1

Ich verstehe Ihre Frage nicht wirklich, aber Code wie folgt:

template<class _T> class B; 

ist illegal. C++ reserviert Namen mit einem Unterstrich und einem Großbuchstaben für den Compiler & Bibliothek Implementierung - Sie sind nicht erlaubt, sie in Ihrem eigenen Code zu verwenden.

+0

Dank dieser Hilfe zu mir –

3

Ja, Sie brauchen. Beachten Sie, dass alle drei Zeilen unterschiedliche Dinge tun. Der erste erklärt eine Klasse. Der zweite deklariert eine Vorlage und der dritte deklariert einen typedef-name. Wenn Sie typedef-name deklarieren, können Sie einen elaborierten Typspezifizierer wie "Klasse A" verwenden, um die Klasse zu benennen, ohne ihren Namen im Geltungsbereich zu haben (mit einigen unangenehmen Fallstricken) - aber Sie können die Template-Deklaration nicht mit der typedef-Deklaration weiter reduzieren.

Ich würde mir keine Sorgen um die drei Zeilen machen. Wenn es notwendig ist, würde ich sie nur schreiben :)

+0

Ich hatte gehofft, dass, da ich es nur für einen privaten Zeiger verwende, es eine nette Möglichkeit wäre, nur zu reservieren der notwendige Raum, ohne die zugrunde liegenden Details preisgeben zu müssen. –

+0

Was meinst du? Kannst du bitte Code in die Frage schreiben wie du es sehen möchtest und wie es jetzt aussieht? Ich denke, wir können es dann besser verstehen –

Verwandte Themen