Klasse in Vector speichern



  • Hallo, wie muss ich hier dem Konstruktor die Parameter richtig übergeben?

    Bei push_back bekomme ich immer diese Fehlermeldung:

    [C++ Fehler] class_vec.cpp(28): E2285 Keine Übereinstimmung für 'vector<window,allocator<window> >::push_back(int,int)' gefunden

    #include <iostream>
    #include <vector>
    using namespace std;
    
    class window{
    
    public:
    
    int height;
    int wide;
            window ( int win_height , int win_wide ) :
            height ( win_height) , wide ( win_wide)
            {
    
            }
    
          ~  window() {}
    
    };
    
    int main()
    {
    vector< window > win;
    
    win.push_back( 0 ,0 ) ;
    
    win[0]. height =2;
    win[0]. wide = 8;
    
    cout<< win [0] . height  << endl;
    
    cout<< win [0] . wide << endl ;
    
    system("PAUSE");
    }
    


  • vector_ schrieb:

    Hallo, wie muss ich hier dem Konstruktor die Parameter richtig übergeben?

    Probiere mal:

    win.push_back(window(0 ,0)) ;
    

    Und versuche mal sinnvoll einzurücken.

    Beispiel:
    (Was ist besser lesbar - deine oder meine Formatierung?)

    #include <iostream>
    #include <vector>
    using namespace std;
    
    class window
    {
      public:
        int height;
        int width;
    
        window(
          int height,
          int width)
        : height(height),
          width(width)
        {
        }
    
        ~window()
        {
        }
    };
    
    int main()
    {
      vector<window> win;
    
      win.push_back(window(0, 0)) ;
    
      win[0].height = 2;
      win[0].width = 8;
    
      cout << win[0].height << endl;
      cout << win[0].width << endl ;
    
      system("PAUSE");
    }
    


  • oder demnächst auch

    win.emplace_back(0,0);
    

    So oder so speichert der Vektor dann ein Objekt und keine Klasse.



  • Wie wär es mit

    win.push_back(window::window(0,0));
    

    ?



  • Hacker schrieb:

    Wie wär es mit

    win.push_back(window::window(0,0));
    

    ?

    Warum sollte das denn funktionieren?



  • theta schrieb:

    Hacker schrieb:

    Wie wär es mit

    win.push_back(window::window(0,0));
    

    ?

    Warum sollte das denn funktionieren?

    Weil es das tut ...?
    Hast du es denn etwa nicht ausprobiert ?
    Manmanman...

    🕶



  • Hacker schrieb:

    Wie wär es mit

    win.push_back(window::window(0,0));
    

    ?

    Funzt nicht. http://ideone.com/psF3i
    Merke: GCC hat (fast) immer Recht.



  • ??? 😕

    Bei mir funzts problemlos...
    Selber Quellcode, selber Compiler (!) (obwohl mit der Version bin ich mir nicht Sicher) ...

    Crazy...

    🕶



  • Hacker schrieb:

    Crazy...

    🕶

    Der Code ist falsch. Der Konstruktoraufruf ist window(0,0) nicht window::window(0,0); Und auch der GCC akzeptiert sowas nicht.


  • Mod

    otze schrieb:

    Der Code ist falsch. Der Konstruktoraufruf ist window(0,0) nicht window::window(0,0); Und auch der GCC akzeptiert sowas nicht.

    Einige Versionen schon, z.B. schluckt es der 4.4.3.. Dadurch wird es natürlich trotzdem nicht richtig oder gar standardkonform. Es ist bloß ein "Feature" eines bestimmten Compilers in einer bestimmten Version, dies ausnahmsweise zu schlucken.

    Und @Hacker: Warum schlägst du denn andauernd solche falschen oder halbfalschen Sachen vor, wenn du dir selber nicht sicher bist? So etwas kann man doch ganz leicht testen. Und wenn du dir bei einer Antwort selber nicht sicher bist, dann antworte doch lieber gar nicht (oder frag selber nach) anstatt den Fragesteller mit einer möglicherweise falschen Antwort zu verwirren.



  • Mal zurück zum Thema, denn auch die vermeidliche Lösung funktioniert nicht.
    Ich habe folgendes geschrieben:

    #include <iostream>
    #include <vector>
    
    class Test{
        int *p_int;
    public:
        Test(){ p_int = new int[10]; }
        ~Test(){ std::cout<<"Destrucktor:" << p_int << std::endl; delete []p_int; }
    
    };
    
    int main(int argc, char *argv[])
    {
        std::cout<< "Get Started !" << std::endl;
        getchar();
        
        std::vector<Test> vec_1;
        vec_1.push_back(Test());
        
        std::cout<< "Stage !" <<std::endl;
        getchar();
        
        vec_1.pop_back();
        std::cout << "Pop done !" <<std::endl;
        
        getchar();
        return 0;
    }
    

    Wenn mann nun den Debugger drüber laufen lässt so sieht man, dass der Destrucktor von Test noch vor << "Stage !" aufgerufen wird. Dieser wird ein zweites mal Aufgerufen bei .pop_back(), weshalb die Adresse p_int zweimal freigegeben wird :-/.

    Ich denke es hat irgendwas mit dem Stack zutun aber keine Ahnung, über Hilfe würde ich mich sehr freuen.

    Ich verwende den QT Creator 4.11.0
    Meine Ausgabe ist:
    /*

    • Get Started !
    • Destrucktor:0x1102568
    • Stage !
    • Destrucktor:0x1102568
    • Pop done !
      */


  • @DangerSlowBrain sagte in Klasse in Vector speichern:

    Mal zurück zum Thema,

    nach mehr als 8 Jahren?





  • @DangerSlowBrain sagte in Klasse in Vector speichern:

    Definiere noch einen Kopierkonstruktor und baue in alle Konstruktoren eine Ausgabe analog zu der im Destruktor ein, dann wirst Du sehen, dass auch 2 Objekte konstruiert werden.


Anmelden zum Antworten