Frage

In der Regel statische Elemente / Objekte einer Klasse sind die gleichen für jede Instanz der Klasse die statische Element / Objekt mit. Sowieso was ist, wenn das statische Objekt Teil einer Template-Klasse ist und hängt auch von dem Template-Argumente? Zum Beispiel wie folgt aus:

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

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

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

War es hilfreich?

Lösung

Statische Elemente sind für jede diffrent Vorlage Initialisierung. Dies liegt daran, dass jede Vorlage Initialisierung eine andere Klasse, die durch den Compiler das erste Mal, dass bestimmte Initialisierung der Vorlage trifft erzeugt wird.

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

#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;
}

Was ergibt

1,2

Andere Tipps

A<int> und A<float> sind zwei völlig verschiedene Arten, können Sie nicht sicher zwischen ihnen werfen. Zwei Fälle von A<int> werden, obwohl die gleiche statische myObject teilen.

Es gibt so viele statischen Membervariablen wie es Klassen, und dies gilt auch für Vorlagen. Jede einzelne Instantiierung einer Template-Klasse schafft nur eine statische Membervariable. Die Anzahl der Objekte dieser Klassen Templat ist irrelevant.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top