Template Methode CopyByConstruction

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Template Methode CopyByConstruction

    Hallo

    Ich schreib grad ein paar Template Methoden und hab da so meine Schwierigkeiten.

    Quellcode

    1. template <typename T> void CopyByConstruction(T* _pTargetBegin, T* _pSourceBegin, T* _pSourceEnd);


    Der Parameter T soll ein komplexer Datentyp sein
    Diese Methode kopiert den Quellbereich in den Zielbereich in dem sie im Zielbereich
    über Placement New den Kopierkonstruktor der Klasse T aufruft. Dabei dürfen sich
    Quell- und Zielbereich nicht überlappen.

    Als erstes müsste ich doch die Größe des komplexen Datentyps herausfinden.
    Und danach die Anzahl der Instanzen die es davon gibt oder?

    Das hier wär mein Grundgedanke wie ich herausfinde ob sich die Bereiche überlappen

    Quellcode

    1. if(_pSourceBegin + sizeof((_pSourceEnd - _pSourceBegin) < _pTargetBegin)



    Das wäre an sich das Kopieren der Bereiche

    Quellcode

    1. // Speicherbereich festlegen
    2. void* Memory = new (sizeof(_pTargetBegin));
    3. /*Placement New; Instanz in Speicherbereich erzeugen*/T* Instance = new (Memory) T(/*Hier müsste doch dann die zu kopierende Instanz als Parameter stehen*/);


    Diesen Vorgang müsst ich ja für jede vorhandene Instanz von T wiederholen oder?
    Ist mein Grundansatz erstmal okay, oder mach ich schon bei meinen Überlegungen Fehler?
    "Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer."
  • Ich hör jetzt zum ersten mal von "Placement New". Ich hab es mir mal angeschaut.

    Zunächst solltest du sizeof mit der typename verwenden nicht mit dem Parameter, den dieser ist ein Pointer und hat die Größe 32/64Bit deswegen vom Typ selbst nehmen.

    So wie ich dass sehe machst du das für eine Klasse, deswegen verstehe ich nicht warum du "Placement New" verwenden willst und nicht das "normale" new.
    Worin bestehen die Vorteile?

    Placement new wird doch verwendet um die Daten möglichst im selben Speicherbereich manuel zu verwalten.

    Mfg Rushh0ur
  • Rushh0ur schrieb:

    So wie ich dass sehe machst du das für eine Klasse, deswegen verstehe ich nicht warum du "Placement New" verwenden willst und nicht das "normale" new.
    Worin bestehen die Vorteile?

    Placement new wird doch verwendet um die Daten möglichst im selben Speicherbereich manuel zu verwalten.
    ja da hast du Recht. Mit dem Placement New kann man Objekte erzeugen und löschen ohne Speicher zu allokieren/deallokieren.
    Für mich ist es auch neu. Ich hatte es erst letztens in einer Vorlesung und muss das nun in meinen Template Hilfsmethoden verwenden.
    Ich werde nochmal meinem Prof. fragen wo genau unter welchen Umständen Placement New von Vorteil sein kann.

    Und danke für deine Hilfe :)

    cheers
    nobody
    "Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer."
  • So hab jetzt endlich mal Zeit meine Lösung zu präsentieren


    Quellcode

    1. template <typename T>
    2. void CopyMethods<T>::CopyByConstruction(T* _pTargetBegin, T* _pSourceBegin, T* _pSourceEnd)
    3. {
    4. if((unsigned long)_pSourceBegin + (unsigned long)(_pSourceEnd - _pSourceBegin) < (unsigned long)_pTargetBegin)
    5. {
    6. int n = _pSourceEnd - _pSourceBegin;
    7. T* pTarget = _pTargetBegin;
    8. T* pSource = _pSourceBegin;
    9. for (int i = 0; i < n ;++i)
    10. {
    11. //Copy Instance via Placement-New
    12. new (pTarget) T(*pSource);
    13. pSource++;
    14. pTarget++;
    15. }
    16. }
    17. }
    Alles anzeigen


    Konnte es aber leider noch nicht auf Korrektheit testen.

    cheers
    Nobody
    "Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer."
  • Rushh0ur schrieb:


    Was soll den die if Abfrage machen?
    Dass das Target nicht innerhalb des Sourcebereichs liegt?


    Ja richtig, die dürfen sich nicht überlappen

    Rushh0ur schrieb:


    Ich denk so wird das nicht ganz funktionieren, außerdem würde ich mir die Abfrage sparen,
    denn man müsste dann noch ne Abfrage reinmachen das der Endbereich des Targets nicht im Sourcebereichs liegt.


    Die Abfrage kann ich mir leider nicht sparen. Es soll wirklich darauf geachtet werden ob sich Quell- und Zielbereich überlappen.
    Aber danke das du mich noch auf die fehlende Abfrage hingewiesen hast. Die werde ich dann wohl noch bei einigen Methoden nachträglich
    reinhauen müssen -.-
    "Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer."