Default-NULL für jeden Typ?



  • Hi

    Gibts sowas wie ein default-NULL für die einzelnen Typen? Ich arbeite mit templates bei der man typename angibt.Jetzt muss ich die Variable, dessen Typ mittels template angegeben wird, NULLen. Ich hab an memset gedacht, aber das macht unportabel...



  • X.DarkForce.X schrieb:

    Jetzt muss ich die Variable, dessen Typ mittels template angegeben wird, NULLen.

    Warum musst du das? Erkläre etwas genauer, was du erreichen möchtest.

    (Nein, man kann nicht beliebige Objekte "nullen".)



  • Angenommen, ich habe eine Klasse, die eine Variable (mit dem Typ, der template-Angabe) beinhaltet. Nun habe ich eine Funktion, welche den Namen "Clear" trägt. Wie soll ich die Variable "clearen"? Wenns ein int ist, OK. Was aber bei komplexen Klassen?



  • type x=type();
    macht das afair für alle eingebauten typen.
    ich vermute, du brauchst es für (placement) new.
    dann x=new type() statt x=new type;
    bin aber gerade ein wenig unsicher.
    http://www.devx.com/tips/Tip/13681



  • Warum genau soll ein komplexerer Typ die Möglichkeit haben, geleert zu werden? Ich habe das Gefühl, du hast ein paar Beispiele im Kopf, für die das Sinn machen mag, aber im Grossteil der Fälle ist so eine Operation wohl nicht angebracht.

    Oder beschreib einmal, was so eine Operation tun soll – und zwar typunabhängig.



  • Dann muss diese Klasse eine Clear Schnittstelle anbieten. Was der "Cleare" zustand ist, kann nur die Klasse wissen. Das hat doch je nach Klasse völlig unterschiedliche Bedeutungen, wenn überhaupt eine existiert. Wenn Du z.B. die Zeiger in der vector Klasse auf 0 setzt ist das etwas vollkommen anderes als was vector::clear macht.



  • Also, ich habe in einer Klasse, ein Array von Variablen des Typen, die vom template bestimmt werden. Jetzt habe ich eine Funktion, die z.B. "ClearElement" heisst:

    void ClearElement(__int32 Element)
    {
      ElementArray[Element]//Was soll ich hier hin tun?
    };
    


  • X.DarkForce.X schrieb:

    Also, ich habe in einer Klasse, ein Array von Variablen des Typen, die vom template bestimmt werden. Jetzt habe ich eine Funktion, die z.B. "ClearElement" heisst:

    void ClearElement(__int32 Element)
    {
      ElementArray[Element]//Was soll ich hier hin tun?
    };
    

    Wenn der Typ T ist,

    void ClearElement(__int32 Element)
    {
      ElementArray[Element]=T();
    };
    


  • Du wiederholst dich. Du sollst nichts dergleichen wie "clear" tun, weil es keine allgemeingültige Semantik gibt, um ein Objekt beliebigen Typs zu leeren. Falls du das anders siehst, dann erklär doch, wie du dir das vorstellst.

    Ohne Weiteres solltest du die Funktionalität entweder streichen oder uns endlich mitteilen, was du wirklich erreichen möchtest. Was heisst es für dich, ein Objekt zu "leeren"? Meinst du zurücksetzen? Falls ja, in welchen Zustand? Was, wenn es keinen Defaultkonstruktor gibt?

    Siehe auch hier:

    Nexus schrieb:

    Ein Objekt selbst hingegen kann man nicht leeren, denn man kann eine Entität an sich nicht löschen. Die Löschung geschieht immer im Bezug auf die Umgebung, welche das eigentliche Objekt referenziert – sei es ein Zeiger bei delete, ein Container bei erase(), oder irgendwas (das gilt im Übrigen nicht nur für C++).

    Genau aus diesem Grund ist ein allgemeines clear() sinnlos. Was sollte es tun? Das Objekt in den Ausgangszustand versetzen? Das ist oft gar nicht möglich, ausserdem sieht C++ für die Überschreibung des gesamten Objekts Zuweisungsoperatoren vor.


Log in to reply