Initialisierung eines Objektvektors über Objektkonstruktor



  • Hallo,

    ich habe mich beim Design eines Programms etwas vertan und stehe jetzt vor dem Problem, dass ich einen vector von Objekten habe, die ich per Konstruktor initialsieren will.

    Der Code schaut in etwa so aus:
    Klassendefinition:

    class myObj 
    {
      private:
        // einige variablen
    
      public: 
        myObj(string _val) : var(_val) 
        {
           // öffne Datei mit Namen var,
           // lese einige Variablen aus, 
           // berechne einige andere Variablen
           // schließe Datei
        }
    };
    
    #include <vector>
    
    main()
    {
      vector<myObj> Data
    
      for(unsigned int i = 0; i < 100; ++i)
      {
        Data.push_back(???); // initialisiere Data mit Dateinamen $i
      }
    
    }
    

    Ich stehe gerade auf dem Schlauch. Gibts da ne Möglichkeit oder geht das voll gegen den Baum?

    Gruß,
    HarryKane



  • So in etwa?

    vector<myObj> Data
    
    stringstream Stream;
    string Str;
    
      for(unsigned int i = 0; i < 100; ++i)
      {
        Stream.str(""); //Stream leeren
        Stream<<i;      //i hineinschreiben
        Str= Stream.str(); //Den Inhalt in Str schreiben, damit wird zb aus i=3 Str="3"
    
        Data.push_back(myObj(Str)); // initialisiere Data mit Dateinamen $i
      }
    

    Was ist dein Problem?
    Die konvertierung von int nach string oder das Initialisieren in während des push_back?



  • Wo liegt das Problem?

    Data.push_back(myObj(/* Argumentliste für Konstruktor */));
    

    Im Weiteren muss hat main() den Rückgabetyp int , was in C++ explizit angegeben werden muss.



  • Nexus schrieb:

    Wo liegt das Problem?

    Data.push_back(myObj(/* Argumentliste für Konstruktor */));
    

    Im Weiteren muss hat main() den Rückgabetyp int , was in C++ explizit angegeben werden muss.

    Öhm ... ja ... man bin ich blöd. Ok, danke ... hab den Wald vor lauter Bäumen nicht gesehen.



  • Geht nicht...



  • Ok, also mein erstes Problem wurde gelöst, ich war wohl gestern etwas neben der Spur. Doch nun hat sich ein anderes Problem aufgetan (ich hoffe das lässt sich ebenso einfach lösen 😉 ).

    Das Problem liegt wohl beim ifstream im Objekt. Wenn ich den ifstream in den Konstruktor packe ist es wohl kein Problem (zumindest meckert er dann nicht).

    Kann mir bitte jemand erklären (für einen Volltrottel wie mich) warum das so nicht geht und was ich anders machen muss?

    #include <string>
    #include <fstream>
    
    class myObj 
    {
      private:
        ifstream file;
        // einige variablen
    
      public: 
        myObj(string _val) : var(_val) 
        {
          file.open(var.c_str());
          // lese einige Variablen aus der Datei, 
          // berechne einige andere Variablen
          // schließe Datei
          file.close();
        }
    };
    
    #include <string>
    #include <vector>
    
    int main()
    {
      vector<myObj> Data
    
      string filename = "dateiname.txt"
      Data.push_back(myObj(filename));
    
     return 0;
    }
    

    Fehlermeldung: (ich hoffe, es verwirrt niemanden zusehr, dass myObj hier TEST heisst).

    test.cc:96: note: synthesized method ‘TEST::TEST(const TEST&)’ first required here
    /usr/include/c++/4.1.2/bits/ios_base.h: In member function ‘std::basic_ios<char, std::char_traits<char> >& std::basic_ios<char, std::char_traits<char> >::operator=(const std::basic_ios<char, std::char_traits<char> >&)’:
    /usr/include/c++/4.1.2/iosfwd:55:   instantiated from ‘void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = TEST, _Alloc = std::allocator<TEST>]’
    /usr/include/c++/4.1.2/bits/stl_vector.h:610:   instantiated from ‘void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = TEST, _Alloc = std::allocator<TEST>]’
    test.cc:96:   instantiated from here
    /usr/include/c++/4.1.2/bits/ios_base.h:782: error: ‘std::ios_base& std::ios_base::operator=(const std::ios_base&)’ is private
    /usr/include/c++/4.1.2/iosfwd:55: error: within this context
    /usr/include/c++/4.1.2/iosfwd: In member function ‘std::basic_istream<char, std::char_traits<char> >& std::basic_istream<char, std::char_traits<char> >::operator=(const std::basic_istream<char, std::char_traits<char> >&)’:
    /usr/include/c++/4.1.2/iosfwd:61: note: synthesized method ‘std::basic_ios<char, std::char_traits<char> >& std::basic_ios<char, std::char_traits<char> >::operator=(const std::basic_ios<char, std::char_traits<char> >&)’ first required here
    /usr/include/c++/4.1.2/iosfwd: In member function ‘std::basic_ifstream<char, std::char_traits<char> >& std::basic_ifstream<char, std::char_traits<char> >::operator=(const std::basic_ifstream<char, std::char_traits<char> >&)’:
    /usr/include/c++/4.1.2/iosfwd:89: note: synthesized method ‘std::basic_istream<char, std::char_traits<char> >& std::basic_istream<char, std::char_traits<char> >::operator=(const std::basic_istream<char, std::char_traits<char> >&)’ first required here
    /usr/include/c++/4.1.2/streambuf: In member function ‘std::basic_filebuf<char, std::char_traits<char> >& std::basic_filebuf<char, std::char_traits<char> >::operator=(const std::basic_filebuf<char, std::char_traits<char> >&)’:
    /usr/include/c++/4.1.2/streambuf:789: error: ‘std::basic_streambuf<_CharT, _Traits>& std::basic_streambuf<_CharT, _Traits>::operator=(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]’ is private
    /usr/include/c++/4.1.2/iosfwd:86: error: within this context
    /usr/include/c++/4.1.2/iosfwd: In member function ‘std::basic_ifstream<char, std::char_traits<char> >& std::basic_ifstream<char, std::char_traits<char> >::operator=(const std::basic_ifstream<char, std::char_traits<char> >&)’:
    /usr/include/c++/4.1.2/iosfwd:89:   instantiated from ‘void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = TEST, _Alloc = std::allocator<TEST>]’
    /usr/include/c++/4.1.2/bits/stl_vector.h:610:   instantiated from ‘void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = TEST, _Alloc = std::allocator<TEST>]’
    test.cc:96:   instantiated from here
    /usr/include/c++/4.1.2/iosfwd:89: note: synthesized method ‘std::basic_filebuf<char, std::char_traits<char> >& std::basic_filebuf<char, std::char_traits<char> >::operator=(const std::basic_filebuf<char, std::char_traits<char> >&)’ first required here
    test.cc: In member function ‘TEST& TEST::operator=(const TEST&)’:
    test.cc:11: note: synthesized method ‘std::basic_ifstream<char, std::char_traits<char> >& std::basic_ifstream<char, std::char_traits<char> >::operator=(const std::basic_ifstream<char, std::char_traits<char> >&)’ first required here
    /usr/include/c++/4.1.2/bits/vector.tcc: In member function ‘void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = TEST, _Alloc = std::allocator<TEST>]’:
    /usr/include/c++/4.1.2/bits/stl_vector.h:610:   instantiated from ‘void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = TEST, _Alloc = std::allocator<TEST>]’
    test.cc:96:   instantiated from here
    /usr/include/c++/4.1.2/bits/vector.tcc:260: note: synthesized method ‘TEST& TEST::operator=(const TEST&)’ first required here
    


  • Öhhm. Hast du alles nötige included?



  • Ja, denke schon (habs oben noch hinzugefügt).

    Ich habe festgestellt, wenn ich ifstream in den Konstrukter schiebe, also

    #include <string>
    #include <fstream>
    
    class myObj 
    {
      private:
        // einige variablen
    
      public: 
        myObj(string _val) : var(_val) 
        {
          ifstream file;
    
          file.open(var.c_str());
          // lese einige Variablen aus der Datei, 
          // berechne einige andere Variablen
          // schließe Datei
          file.close();
        }
    };
    

    schreibe, scheint es zu funktionieren.



  • Ich denke mal, dass der fstream ein Member von Deiner Klasse ist. Streams lassen sich aber nicht kopieren. Du musst also einen Copy-Kosntruktor für Deine Klasse anlegen, und dann den Stream als Referenz weiterleiten, oder noch besser: den stream lokal in der Memberfunktion anlegen.
    Also nochmal im Klartext:
    Beim push_back wird ein temoräres Objekt erzeugt, und das dann in den Vektor kopiert. Das geht aber so nicht, weil Deine Klasse einen fstream als Member beinhaltet, und streams nicht kopierbar sind.



  • push_back verlangt, dass das Objekt kopierbar ist. Deines ist es aber nicht, da du ifstream als Membervariable hast und ifstream ist nicht kopierbar. Mach dein ifstream lokal im Konstruktor und alles sollte gehen.



  • Ah, danke. Stimmt, ich kann ja genauso in den Memberfunktionen den ifstream deklarieren ...

    Ich wusste doch, dass es eine "einfache" Lösung gibt.

    Vielen Dank noch mal. 🙂


Anmelden zum Antworten