2010-02-08 8 views
10

Normalerweise sind statische Member/Objekte einer Klasse für jede Instanz der Klasse mit dem statischen Member/Objekt identisch. Wie auch immer, wenn das statische Objekt Teil einer Template-Klasse ist und auch vom Template-Argument abhängt? Zum Beispiel wie folgt aus:Statisches C++ - Vorlagenelement, eine Instanz für jeden Vorlagentyp?

template<class T> 
class A{ 
public: 
    static myObject<T> obj; 
} 

Wenn ich ein Objekt von A wie int und eine andere als float werfen würde, denke ich, würde es zwei sein obj, eine für jeden Typ?

Wenn ich mehrere Objekte von A als Typ int und mehrere float s schaffen würde, wäre es immer noch zwei obj Instanzen, da ich nur zwei verschiedene Arten verwendet werde?

Antwort

18

Statische Elemente sind für jede Vorlageninitialisierung unterschiedlich. Dies liegt daran, dass jede Vorlageninitialisierung eine andere Klasse ist, die vom Compiler beim ersten Auftreten dieser spezifischen Initialisierung der Vorlage generiert wird.

Die Tatsache, dass statische Membervariablen unterschiedlich sind, wird durch diesen Code dargestellt: gleichermaßen

#include <iostream> 

template <class T> class Foo { 
    public: 
    static int bar; 
}; 

template <class T> 
int Foo<T>::bar; 

int main(int argc, char* argv[]) { 
    Foo<int>::bar = 1; 
    Foo<char>::bar = 2; 

    std::cout << Foo<int>::bar << "," << Foo<char>::bar; 
} 

die in

1,2 
+0

"anders gleich"? ;) – jamesdlin

+0

Da es sich um statische Member handelt, wäre das Beispielprogramm klarer, wenn es keine Foo Instanzen erzeugt hätte. Anstatt bar1.s zuzuweisen und auszudrucken, können Sie stattdessen Foo :: s verwenden. –

+0

@jamesdlin Ug. Fest. Ich sollte nicht versuchen, die Logik in einem Satz umzudrehen und dann nicht richtig zu lesen. – Yacoby

3

Es gibt so viele statische Membervariablen führt, wie es Klassen gibt, und dies gilt zu Vorlagen. Jede separate Instantiierung einer Vorlagenklasse erstellt nur eine statische Elementvariable. Die Anzahl der Objekte dieser Templates ist irrelevant.

4

A<int> und A<float> sind zwei völlig unterschiedliche Typen, zwischen denen Sie nicht sicher zwischen ihnen wechseln können. Zwei Instanzen von A<int> teilen jedoch das gleiche statische myObject.

+0

danke, das war kurz, aber klärte alles auf, was ich wissen musste :) – user240137

1

In C++ - Vorlagen sind tatsächlich Kopien von Klassen. Ich denke, in Ihrem Beispiel würde es eine statische Instanz pro Vorlageninstanz geben.

+1

"C++ - Vorlagen sind eigentlich Kopien von Klassen": das macht keinen Sinn. 0) gibt es auch Template-Funktionen und Template-Member-Funktionen, 1) definieren "kopieren". Ich denke, was Sie meinen ist, dass jede Klassenvorlage-Instanziierung einen neuen Klassentyp darstellt. –

+0

Ja im Gegensatz zu Java erstellt C++ intern eine Kopie der Klasse, wobei der Vorlageteil ausgefüllt wird. – Thirler

Verwandte Themen