Template



  • Hallo,
    ich weiß mitlerweile das Template deklarationslose variablen oder klassen sind.
    was allerdings wird vor der class CTemplPerson festgelegt?
    wird die variable im cpp programm dann TPerson aufgerufen oder gibt es da eine andere variante?
    und was macht das #pragma once da?

    dieser text stammt aus einer header datei.

    #pragma once
    template <class T>
    class CTemplPerson
    {
    public:
    	T	TPerson;
    };
    


  • #pragma  once
    

    am Anfang einer Header Datei bedeutet dass diese nur einmal eingebunden wird. (Includeguard)

    Das andere vielleicht anhand eines Beispiels

    class MyPerson
    {
    public:
      std::string vorname;
      std::string nachname;
    };
    
    class Person
    {
    public:
      std::string Vorname;
    };
    
    template<class T>
    class TemplatePerson
    {
    public:
       T TPerson;
    };
    
    int main()
    {
       TemplatePerson<Person> p1;
       TemplatePerson<MyPerson> p2;
    
       p1.TPerson.Vorname = "Dieter";
       p2.TPerson.Vorname = "Peter";
       p2.TPerson.Nachname = "Mustermann";
       p1.TPerson.Nachname = "Fehler"; // Error;
    
       return 0;
    };
    

    Die Klasse benutzt ganz normal ein Template.

    Gruß



  • Könnte mir das jemand mit dem #pragma once noch mal genauer erklären. Ich habe schon viel gegoogelt, jedoch solch eine konkrete Antwort habe ich noch nicht gefundne.



  • Genau wie schon gesagt:

    #pragma once verhindert dass diese Header-Datei mehrmals includet/(vom compiler durchgecheckt) wird.
    Wenn du zum beispiel in einem Header-file eine klasse definierst, und
    du dieses File in mehreren .cpp-datein einbindest, dann kommt so nen Fehler
    "Klasse so-und-so wurde schon in der Datei so-und-so.cpp definiert".
    Damit das nicht passiert und die datei nur einmal inkludet wird benutzt man
    #pragma once

    Man könnte auch folgendes machen:

    Headerdatei

    // Wurde _IG_MYCLASS_ schon definiert ?
    #ifndef _IG_MYCLASS_
    
    // Anscheinend nicht. Also definieren wir es, damit die klasse nicht noch mal geparset wird
    #define _IG_MYCLASS_
    
    ...
    Klassendefinitionen
    ...
    
    // Und zum schlus noch ein eindif
    #endif
    

    #pragma once ist einfach nur die leichtere, bequemere und sogar performantere lösung
    Funktioniert allerdings soweit ich weiß, aber nur mit VC++


Anmelden zum Antworten