array in struct zur laufzeit initialisieren


  • Mod

    krümelkacker schrieb:

    🙄
    - Verletzung der Dreierregel bei struct ABC

    Das musst du aber mir ankreiden, weil ich ihm das so vorgegeben habe. Ich wollte nicht zu viel auf einmal bringen, sondern erst einmal Konstruktoren zeigen (die er offensichtlich noch nicht kannte). Und ich hatte eigentlich erwartet, dass er gleich, wie von mir vorgeschlagen, einen vector nimmt, anstatt die Idee weiter zu verfolgen.



  • Okay danke, dann weiß ich was die größe angeht bescheid.

    Das ist ganz böse. Du erstellst im dynamischen Speicher ein Objekt, kopierst es und vergisst den Zeiger.

    Was meinst du damit?

    Ich hab die create funktion jetzt nochmal angepasst:

    ABC create(int capacity)
    {
       ABC rb(capacity);  
       return rb;
    }
    

  • Mod

    proty schrieb:

    Ich hab die create funktion jetzt nochmal angepasst:

    ABC create(int capacity)
    {
       ABC rb(capacity);  
       return rb;
    }
    

    Das ist prinzipiell ok, wenn man es richtig macht, aber:
    - Wozu soll das gut sein?
    - Wie krümelkacker schon sagte, habe ich in meinem Beitrag nicht alle nötigen Funktionen einer Klasse implementiert, die Daten dynamisch verwaltet. Unter anderem habe ich den Kopierkonstruktor weggelassen, daher ist das was hier geschieht nicht in Ordnung.

    Beantworte aber erst einmal die Fragen die dir hier im Thread gestellt wurden.



  • Es wurde ja schon darauf hingewiesen

    struct ABC
    {
       std::vector<int> values;
       ABC(size_t size): array(size){}
    }; 
    
    int main()
    {
      // ABC* abc = new ABC(256);
      // abc->values[260];
      // tu so
      ABC abc(256);
      abc.values.at(260); // jetzt sagt dir dein Programm auch, dass das nicht geht
      return 0;
    }
    

    edit: häm.. da hing ich wohl ein wenig zu lang in der Leitung...



  • - Wozu soll das gut sein?

    Ich will eine create funktion schreiben, da, wenn das mal richtig tut, weitere member in die struct kommen und die dann in der create funktion benutzt werden.

    wenn ich

    struct ABC
    {
       vector<int> array;
       ABC(size_t size): array(size){}
    };
    

    schreibe, sagt der compiler bei sowas

    rb.array[i]
    

    dass struct ABC kein meber array hat...?



  • proty schrieb:

    Das ist ganz böse. Du erstellst im dynamischen Speicher ein Objekt, kopierst es und vergisst den Zeiger.

    Was meinst du damit?

    Dass du das soeben dynamisch erstellte Objekt kopierst, wogegen nichts einzuwenden ist, aber dann den für das anschließende delete nötigen Zeiger dir nicht merkst. Du sollst nach Möglichkeit immer ein delete auf ein new folgen lassen. Nur in ganz wenigen Ausnahmefällen könnte man es aus Geschwindigkeitsgründen weg lassen.


  • Mod

    proty schrieb:

    - Wozu soll das gut sein?

    Ich will eine create funktion schreiben, da, wenn das mal richtig tut, weitere member in die struct kommen und die dann in der create funktion benutzt werden.

    Es kann Fälle geben, wo dies sinnvoll ist, aber ich gehe sehr stark davon aus, dass dies keiner davon ist.

    wenn ich

    struct ABC
    {
       vector<int> array;
       ABC(size_t size): array(size){}
    };
    

    schreibe, sagt der compiler bei sowas

    rb.array[i]
    

    dass struct ABC kein meber array hat...?

    Das sollte nicht sein. Gibt's andere Fehlermeldungen? Womöglich vector nicht eingebunden?



  • SeppJ schrieb:

    proty schrieb:

    - Wozu soll das gut sein?

    Ich will eine create funktion schreiben, da, wenn das mal richtig tut, weitere member in die struct kommen und die dann in der create funktion benutzt werden.

    Es kann Fälle geben, wo dies sinnvoll ist, aber ich gehe sehr stark davon aus, dass dies keiner davon ist.

    Gibts dann eine andere möglichkeit dem nicht vollständig definierten array im struct int array[] beim initialiseren einer neuen struct variable die länge zuzuweisen?

    wenn ich

    struct ABC
    {
       vector<int> array;
       ABC(size_t size): array(size){}
    };
    

    schreibe, sagt der compiler bei sowas

    rb.array[i]
    

    dass struct ABC kein meber array hat...?

    Das sollte nicht sein. Gibt's andere Fehlermeldungen? Womöglich vector nicht eingebunden?

    die fehlermeldung is

    error: invalid conversion from ‘int*’ to ‘long unsigned int’
    und
    error: initializing argument 1 of ‘std::vector<_Tp, _Alloc>::vector(size_t, const _Tp&, const _Alloc&) [with _Tp = int, _Alloc = std::allocator<int>]’



  • mein ganzer quellcode sieht so aus:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    struct ABC
    {
       vector<int> array;
       ABC(size_t size) : array(new int[size]) {}
    
    };
    
    ABC create(int capacity)
    {
       ABC rb(capacity);
    
       return rb;
    }
    
    int main()
    {
       ABC rb = create(256);
       cout << sizeof(rb.array) << endl;
       for (int i = 0; i < 256; ++i)
       {
          rb.array[i] = i+1;
          cout << rb.array[i] << endl;
       }
       return 0;
    }
    


  • 🙂

    probiers mal mit:

    Zeile 9: ABC(size_t size) : array(size) {} // damit wird die Arraygröße zur Erstellungszeit festgelegt
    
    Zeile 23: cout << rb.array.size() << endl;
    

    Und bitte mach mal den Quatsch mit der create-Funktion weg.



  • Also so:

    struct ringbuffer
    {
       vector<int> array;
       ringbuffer(size_t size) : array(size) {}
    };
    
    int main()
    {
       ringbuffer rb(256);
       cout << rb.array.size() << endl;
       for (int i = 0; i < 256; ++i)
       {
          rb.array[i] = i+1;
          cout << rb.array[i] << endl;
       }
       return 0;
    }
    

    Tausend Dank euch allen 🙂


Anmelden zum Antworten