Probleme beim Initialisieren eines vektors als Klassen-Variable





  • @Roman:

    Mit was willst Du den Vektor denn initialisieren?
    Was hältst Du von einer Schleife? Da brauchst Du zwar auch 200 push_backs, aber Du mußt es nur einmal tippen.

    MfG Jester



  • Jester schrieb:

    Was hältst Du von einer Schleife? Da brauchst Du zwar auch 200 push_backs, aber Du mußt es nur einmal tippen.

    generate ginge aber auch.

    Roman1311 schrieb:

    class Irgendwas { 
      private: 
        string Str[]; 
        void init(); 
        ... 
      public: 
       ... 
    };
    .
    .
    .
    void Irgendwas::init() { 
      this->Str[] = {"Test1", "Test2", "Test3"}; 
    }
    

    Da funktioniert das aber leider auch nicht.

    da wirst du auch eine schleife oder irgendwelche fill algorithmen brauchen.

    warum verwendest du einen init methode? warum nicht den konstruktor?



  • @davie:

    init ist private, daher vermute ich, er ruft init vom Konstruktor aus auf, um den Code übersichtlich zu halten. Klingt eigentlich vernünftig.



  • Ich wollte es eigentlich so wie unter C machen

    char *Array[] = {"Text1", "blabla", "noch ein Text", "und schon wieder"};
    

    Nur wollte ich das als Klassenvariable deklarieren, und danach in der Methode init() initialisieren, ohne das ich untereinander 200 push_back einträge habe.

    @Jester: Hast recht, ich rufe unter anderem die init()-Methode im Konstruktor auf. Den ich habe schon bei grösseren Projekten gemerket, je mehr man splittet, desto mehr kann man den Code wieder in einem anderen Projekt verwenden.

    @Devie: Die Werte sind statisch, und auch nicht mit einer Schleife lösbar, außer ich verschiebe es von einem Array in ein anderes, und das kann man auch besser über einen Kopierkonstruktor lösen

    Nun zu meinem Problem, es muss doch unter C++ irgendeine Möglichkeit geben um es genauso in einer Methode zu initialisieren, nur möchte ich halt nicht mit "char*" sondern mit string oder sonst einer STL, weil ich die STL-Methoden später noch brauche(find, replace, substr, ...). Deshalb wäre mir ein String oder Vector schon lieber.

    MfG Roman1311



  • Naja, im Prinzip gibt's zwei Möglichkeiten das dennoch zu erreichen.

    1. Du legst in der Funktion lokal das Array mit den Werten an, so wie in C und kopierst die Werte dann in Deinen vector.

    2. Du liest die Werte aus einer Datei direkt in den vector.

    MfG Jester



  • Das heisst in etwas so?:

    char *Array[] = {"Text1", "blabla", "noch ein Text", "und schon wieder"};
    
    for(int i=0; i<4; i++)
      StrVec.push_back(Array[i]);
    
    delete [] Array;
    

    Nur kann ich das Array dann mit "delete [] Array;" löschen, denn sonst habe ich unnötigen Speicherverbrauch.

    MfG Roman1311



  • doppelt



  • Das mit dem löschen würd ich mal lieber lassen, die Daten liegen nämlich auf dem Stack... und werden damit automatisch freigegeben, wenn Du die Funktion verläßt. Was bei delete passiert kann ich Dir nicht sagen, ich weiß nur so viel: im günstigsten Fall stürzt Dein Programm ab. 😉

    Merke: immer nur Sachen mit delete freigeben, die zuvor mit new angefordert wurden. kein new => kein delete.

    Eigentlich ganz einfach,
    Jester



  • Jester schrieb:

    Das mit dem löschen würd ich mal lieber lassen, die Daten liegen nämlich auf dem Stack... und werden damit automatisch freigegeben, wenn Du die Funktion verläßt. Was bei delete passiert kann ich Dir nicht sagen, ich weiß nur so viel: im günstigsten Fall stürzt Dein Programm ab. 😉

    das heißt, folgendes funktioniert nicht:

    const char *greet (int which) {
       const char *text[] = { "Welcome", "Willkommen", "Yoroshiku", "Bienvenu" };
       return text[which%4];
    }
    
    int main() {
       extern int language;
       cout << greet(language) << endl;
    }
    

    und folgendes auch nicht:

    const char *foo () { return "ho"; }
    int main () { cout << foo() << endl; }
    

    Die Codes sind übrigens OK 😉


Anmelden zum Antworten