Problem mit 'Objekte anfordern'



  • Hallo Leute,

    ich habe leider ein kleines Problem:

    ich habe eine Klasse geschrieben, sogar in einem eigenen Namespace. Ich möchte ein neues Objekt dieser Klasse global anlegen aber erst in einer Funktion. Denn der Konstruktor dieser Klasse ruft Funktionen auf die, wenn man sie zu früh aufruft, Fehler verursachen.

    Kann mir jemand sagen wie das geht, mit new und delete hat das meines Wissenes auch nichts zu tun.

    Danke++ 🙂



  • Code? Fehler?



  • LukasBanana schrieb:

    Hallo Leute,

    ich habe eine Klasse geschrieben, sogar in einem eigenen Namespace. Ich möchte ein neues Objekt dieser Klasse global anlegen aber erst in einer Funktion.

    Global in einer Funktion, das wäre dann lokal...

    LukasBanana schrieb:

    Denn der Konstruktor dieser Klasse ruft Funktionen auf die, wenn man sie zu früh aufruft, Fehler verursachen.

    Dann solltest du dir dein design mal überlegen...oder hoffen, das jeder GENAU deine Doku zu der Klasse ließt...

    LukasBanana schrieb:

    Kann mir jemand sagen wie das geht, mit new und delete hat das meines Wissenes auch nichts zu tun.

    ich würde sagen, doch!



  • Objekt* g_Objekt = NULL;
    
    void eineErstellFunktion()
    {
      g_Objekt = new Objekt;
    }
    
    int main()
    {
      // mach was
      eineErstellFunktion();
      // mach was
      delete g_Objekt;
    }
    


  • ser1al_ausgeloggt schrieb:

    LukasBanana schrieb:

    Kann mir jemand sagen wie das geht, mit new und delete hat das meines Wissenes auch nichts zu tun.

    ich würde sagen, doch!

    Aber mit new und delete mache ich das Objekt doch auch nicht lokal?!



  • LukasBanana schrieb:

    ...
    Kann mir jemand sagen wie das geht, mit new und delete hat das meines Wissenes auch nichts zu tun.
    Danke++ 🙂

    Wieso nicht ?
    Du kannst z.B. einen globalen Zeiger auf dein Objekt deklarieren und in deiner Funktion mit new dein Objekt erzeugen. 🙂

    Gruß, p.



  • Danke "Maxi", gute Idee, ich werd`s mal probieren! 🙂
    Und Danke, an die anderen 😃



  • Oder etwas Narrensicherer, sofern beim Destruktoraufruf nicht Abhängigkeiten existieren, ist etwas in der folgenden Art:

    Objekt& Instance()
    {
      static Objekt a;
      return a;
    }
    

    Falls dir Pointer lieber sind geht das natürlich auch, wenn man statt der Referenz die Speicheradresse zurückliefert...

    cu André



  • OK, danke, aber noch eine kurze andere Frage zu new und delete:

    Wie kann ich in einer Klassen-Funktion das aktuelle Objekt löschen?

    Vielleicht so:

    void Klasse::Funktion() {
      delete; /* lösche ich so das aktuelle Objekt, welches diese Funktion verwändet? */
    }
    




  • oh ja, das darf man leider nur in den wenigsten Fällen verwänden 😞

    Aber ok, und wie kann ich denn in einen mit new gefüllten pointer iterieren?



  • LukasBanana schrieb:

    ...das darf man leider nur in den wenigsten Fällen verwänden 😞 ...

    und zwar mit gutem Grund.
    Ich behaupte mal (anhand der Fragen, die Du stellst): Du suchst nach "falschen Lösungen" !
    Sag' doch mal, was Du machen möchtest, dann können wir Dir bestimmt bessere Wege zeigen.

    LukasBanana schrieb:

    ...
    Aber ok, und wie kann ich denn in einen mit new gefüllten pointer iterieren?

    "in einen Pointer" kann man sowieso nicht itereieren, sondern bestenfalls "durch/über ein/en Array/Container" und die Antwort ist easy: Immer gleich.

    Mit "[]" bzw. dem Äquivalent "+i".

    BTW: Der Ansatz mit der globalen Variable und der ungeklärten "Ownership" ist IMO bedenklich/überdenkenswert.

    Gruß,

    Simon2.



  • Also was ich wissen wollte war:
    wie man eine for-Schleife programmiert wenn man mit new und delete arbeitet.

    Gruß LukasBanana



  • Sag uns mal genauewr was du eigentlich vor hast.
    Eine for-schleife verändert ihr Aussehen auch dann nicht wenn du irgendwo ein new verwendest.



  • Naja, sieht das dann vielleicht so aus:

    Objekt* p = new Objekt;
    for (int i = 0; i < /*wie soll ich z.B. die Anzahl Objekte abfragen auf die der Pointer zeigt?*/; ++i) {
      p[i] // ist das richtig?
      delete p[i] // ... und das?
    }
    

    Eben wie ich alle Objekte, auf die der Pointer zeigt (Objekt* p), 'durchlaufen' kann?



  • LukasBanana schrieb:

    Objekt* p = new Objekt; // Simon2: Hier erzeugst Du EIN EINZIGES Objekt !!
    

    Was Du möchtest, ist, ein Array dynamisch anzulegen und genau an der Stelle, an der Du Dein Fragezeichen hast, wird klar, dass Dir Information fehlt !
    Und zwar musst DU die Frage beantworten: Wieviele Objekte möchtest Du haben ?

    std::size_t meineAnzahl = ...;
    Objekt* p = new Objekt[meineAnzahl]; // Array dynamisch erzeugen und p auf das erste Element zeigen lassen
    for (int i = 0; i < meineAnzahl; ++i) {
      p[i].doSomething();
    }
    delete[] p; // Array erst vernichten, wenn Du es nicht mehr brauchst
    

    Gruß,

    Simon2.



  • Das mit dem Array habe ich schon mal gesehen, aber soll man new und delete nicht auch dafür verwänden können dass wenn man nicht weiß wie viele Elemente man haben will?!
    Also wenn man immer wieder neue dazu machen möchte.



  • LukasBanana schrieb:

    Daber soll man new und delete nicht auch dafür verwänden können dass wenn man nicht weiß wie viele Elemente man haben will?!

    Ja, nämlich genau dann wenn Du zur Compilezeit nicht weisst wieviele Objekte Du haben willst.

    Wenn die Anzahl sich zur Laufzeit ändert (nach oben), kannst Du meistens nur neuen Speicher anfordern und die Werte aus dem alten Speicherbereich rüberkopieren. So etwas machen u.a. die Datenstrukturen der Standardbibliothek (z.B. std::vector) ganz hervorragend für Dich.



  • Okay, alles klar.
    Hab in zwischen ne gute Lösung mit Vectors gefunden.
    Danke an alle 🙂
    Gruß LukasBanana


Anmelden zum Antworten