Objektpointer und der Gültigkeitsbereich...



  • Hallo Comm, ich bins mal wieder :D,

    im Moment kämpfe ich mit dem guten alten Gültigkeitsbereich.
    Folgender Code gibt mir Scope-Errors:

    ...Definition von MyClass...
    
    void load(){
    
    MyClass* mc = new MyClass(argumente);
    mc->func();
    mc->func2();
    
    }
    //bis hierhin ist alles ok
    
    int main(){
    
    load(); //ok
    mc->func3(); //FEHLER, unknown reference
    
    }
    

    Wie schaffe ich es, außerhalb der load() Funktion weiterhin mit den darin erstellten Objekten (Objektzeigern) zu arbeiten?

    Danke im Voraus



  • Einfach den Zeiger zurückgeben?


  • Mod

    Jonas OSDever schrieb:

    Einfach den Zeiger zurückgeben?

    Besser: Gar nicht so etwas programmieren. Ein mit new erstelltes Objekt über einen rohen Zeiger aus einer Funktion herausgeben ist äußerst unsauber und provoziert Fehler en masse.

    Die wahre Frage ist daher, was hier erreicht werden soll, nicht wie der Threadersteller sich die technische Umsetzung vorstellt. Es gibt garantiert eine deutlich bessere Lösung.



  • Ja klar bei einem objekt geht das noch. Aber wenn die anzahl der objekte die in der funktion erstellt werden unbestimmt viele sind. Wenn es zum beispiel 50 sind und wenn man dann noch ein neues erstellen will, also das 51. Objekt erstellen will, wie gebe ich eine variable anzahl zurück sozusagen?


  • Mod

    kralo9 schrieb:

    Ja klar bei einem objekt geht das noch. Aber wenn die anzahl der objekte die in der funktion erstellt werden unbestimmt viele sind. Wenn es zum beispiel 50 sind und wenn man dann noch ein neues erstellen will, also das 51. Objekt erstellen will, wie gebe ich eine variable anzahl zurück sozusagen?

    Mein Hinweis ist soeben 5 Stufen relevanter geworden.



  • #include <vector>
    
    std::vector<object> gimme_more_objects()
    {
      std::vector<object> v;
      ...
      return v;
    }
    
    int main()
    {
      auto v = gimme_more_objects();
    }
    


  • Die funktion soll einfach nur viele objekte erstellen damit ich diese funktion schön auslagern kann und die ganze initialisierung nicht in der main funktion rumschwimmt



  • cooky451 schrieb:

    #include <vector>
    
    std::vector<object> gimme_more_objects()
    {
      std::vector<object> v;
      ...
      return v;
    }
    
    int main()
    {
      auto v = gimme_more_objects();
    }
    

    Was ist das und wie geht das?



  • Kralo9notloggedin schrieb:

    cooky451 schrieb:

    #include <vector>
    
    std::vector<object> gimme_more_objects()
    {
      std::vector<object> v;
      ...
      return v;
    }
    
    int main()
    {
      auto v = gimme_more_objects();
    }
    

    Was ist das und wie geht das?

    Ich hoffe das bezieht sich auf auto 😮
    Sonst lern lieber erstmal richtig C++..
    Vector



  • Nymer schrieb:

    Kralo9notloggedin schrieb:

    cooky451 schrieb:

    #include <vector>
    
    std::vector<object> gimme_more_objects()
    {
      std::vector<object> v;
      ...
      return v;
    }
    
    int main()
    {
      auto v = gimme_more_objects();
    }
    

    Was ist das und wie geht das?

    Ich hoffe das bezieht sich auf auto 😮
    Sonst lern lieber erstmal richtig C++..
    Vector

    Ja kannst du es mir bitte anhand meines codes zeigen?



  • auto bestimmt nur den Typ automatisch. vector ist ein Container. Du kannst ihn beliebig vergrößern, verkleinern, Elemente anhängen etc. Der Speicher wird sicher in seinem Destruktor freigegeben, das kannst du also auch nicht mehr vergessen.

    #include <iostream>
    #include <vector>
    
    std::vector<int> gimme_more_objects()
    {
      std::vector<int> v;
      for (int i = 0; i != 100; ++i)
        v.push_back(i);
      return v;
    }
    
    int main()
    {
      std::vector<int> v = gimme_more_objects();
      for (std::size_t i = 0; i != v.size(); ++i)
        std::cout << v[i] << '\n';
    }
    

    Um zu verstehen wie vector das macht, solltest du die Grundlagen von Klassen, Operatorüberladungen und Templates kennen.



  • cooky451 schrieb:

    Der Speicher wird sicher in seinem Destruktor freigegeben, das kannst du also auch nicht mehr vergessen.

    Bzw.: "...das kannst Du nun getrost vergessen." 😉



  • Also wie ich es verstehe ist vector ein behälter wo ich die erstellten objekte aneinanderhänge. In die spitzen klammer kommt der klassenname und dann kann ich den container zurückgeben? Arbeite ich dann mit dem. Ontainer oder kann ich direkt mit dem inhalt arbeiten?



  • Bzw. Hab ich mit vector einen dynamischen array der mitwächst?



  • Stillmrkralo schrieb:

    Also wie ich es verstehe ist vector ein behälter wo ich die erstellten objekte aneinanderhänge. In die spitzen klammer kommt der klassenname und dann kann ich den container zurückgeben?

    In den spitzen Klammern steht der Template-Parameter. Heißt der Typ der Objekte, die der vector verwalten soll.

    Stillmrkralo schrieb:

    Arbeite ich dann mit dem. Ontainer oder kann ich direkt mit dem inhalt arbeiten?

    Die Frage macht nicht wirklich Sinn, aber ich versuche mal darauf zu antworten. Du arbeitest mit dem Container. Der hat z.B. Methoden wie .push_back(), .size(), .erase(), etc. Eine vollständige Auflistung findest du in einer Referenz.
    http://en.cppreference.com/w/cpp/container/vector
    Trotzdem kannst du natürlich auf einzelne Elemente zugreifen. z.B. über den operator []. v[0] greift auf das erste, v[1] auf das zweite Element etc. zu. Du darfst natürlich nur bis maximal v[v.size() - 1] zugreifen. Wie bei einem Array halt.



  • Kralo9still schrieb:

    Bzw. Hab ich mit vector einen dynamischen array der mitwächst?

    Hab ich dOch so schon richtig verstanden.
    Aber ich hab dann keine möglichkeit mehr, mit den "richtigen" objektnamen zu arbeiten? Sprich mc, wie es in meinem code am anfang stand.



  • Dynamisch angeforderter Speicher hat keinen Bezeichner. Dein mc war auch nur ein Pointer.



  • Ja schon. Aber es wäre dennoch einfacher die objekte hinterher direkt mit ihrem namen zu referenzieren, weil jedes sich von allen andren unterscheidet. (zum besseren verständnis: die objekte sind buttons in meinem spiel die jeweils andere positionen und texturen haben. Somit is es einfacher das objekt startgamebutton zu referenzieren als v[12]) Gibts dafür eine geschicktere lösung. Wie siehts aus mit enum?



  • Macht es denn überhaupt Sinn, die Buttons in einem Vektor zu speichern?
    Evtl. ist es besser, pro Buttonart eine eigene Klasse zu verwenden?



  • Ich hab eine allgemeine klasse die sich auf buttons spezialisiert. Und für jeden button will ich ein objekt anlegen. Ich mach da doch lieber 100 objekte die fast gleich sind, bis auf position und textur, anstatt 100 klassen. Ich nehme schliesslich auch 1 auto und kann mit dem in 100 verschiedene städte fahren und hab nicht 100 autos für 100 städte, oder?


Anmelden zum Antworten