conversion to non-scalar type requested



  • Hallo,

    Ich habe ein Pointer Verständniss Problem. Nach rumprobieren liefert der compiler keine Fehlermeldung mehr. Aber ich würde mich sehr über erklärende Hilfe warum dem so ist freuen.

    Folgender Code wirft beim Kompilieren die Fehlermeldung:
    error: conversion from ‘BOSegment*’ to non-scalar type ‘BOSegment’ requested

    ExtendedHalfSegment nextExtHs;
    BOSegment nextEventl = new BOSegment(
    			nextExtHs,
    			nextExtHs.GetLeftPoint().GetX(),
    			nextExtHs.GetLeftPoint().GetY(),
    			start,
    			boOwner);
    events.push_back(nextEventl);
    

    Deklaration des Konstruktors:

    BOSegment(const HalfSegment& hs, const double x, const double y, const boPointType pointtype , const boOwnertype owner);
    

    Folgender Aufruf liefert keine Fehlermeldung

    BOSegment *nextEventl = new BOSegment(
    			nextExtHs,
    			nextExtHs.GetLeftPoint().GetX(),
    			nextExtHs.GetLeftPoint().GetY(),
    			start,
    			boOwner);
    events.push_back(*nextEventl);
    

    Warum wird ein Pointer bei *nextEventl benötigt?
    Danke im Vorraus!



  • Objekte auf dem "Stack" werden ohne "new" automatisch angelegt und auch automatisch, wenn der "Scope" verlassen wird, aus dem Speicher entfernt.
    Ein Objekt kann auch auf dem "Heap" angelegt werden (Zugriff über einen Zeiger). Dieses geht über "new" (es wird Speicher belegt). Dann ist es notwendig, das Objekt (den Speicher) mittels "delete" wieder frei zu geben.
    Es sollten Objekte vorzugsweise auf dem "Stack" oder über "smartpointer" angelegt werden.
    Alles in " kann recherchiert werden 😉
    Gruß Helmut



  • new erzeugt das Objekt im Freispeicher und liefert einen Zeiger darauf zurück. Deswegen. Dein "Fix" mag kompilieren, sieht aber für mich nach einem Speicherleck aus, da nirgends ein delete zu sehen ist. Zu jedem new gehört ein delete.

    Deine Erwartungshaltung lässt mich vermuten, dass Du vorher so etwas wie Java oder C# programmiert hast und Dir nicht der Unterschiede zwischen diesen Sprachen und C++ bewusst bist. C++ zwingt Dir bei Klassen-Typen keine Indirektion auf. Eine Variable eines Klassen-Typs ist in C++ das Objekt selbst und keine Referenz darauf.

    Du könntest auch schreiben:

    events.push_back(BOSegment(
       nextExtHs,
       nextExtHs.GetLeftPoint().GetX(),
       nextExtHs.GetLeftPoint().GetY(),
       start,
       boOwner));
    

    Also ohne "new". Hier wird ein temporäres Objekt im automatischen Speicher erzeugt. Der Container erzeugt dann eine Kopie davon im eigenen Speicher. Das temporäre Objekt wird quasi mit dem Semikolon wieder zerstört.

    Ich empfehle Dir, in einem schlauen Buch mal das C++ Objektmodell und die Sache mit den drei Speicherbereichen nachzugucken.



  • Danke!


Anmelden zum Antworten