Klassen(Reihenfolge)



  • #include <iostream>
    #include <vector>
    using namespace std;
    //Klasse , die nicht funktioniert
    class MeinVektor {
    vector<int> vec ; // falsche
    const unsigned int N; // Reihenfolge ! ! !
    public :
    MeinVektor ( ) : N(5) , vec (N)
    { cout << vec.size () << endl; }
    } ;
    int main () {
    MeinVektor meinVektor ;
    return 0 ;
    }
    

    Was genau ist die falsche Reihenfolge? Müssen etwa vektor<int> vecM und const unsigned int N; vertauscht werden?



  • Müssen etwa vektor<int> vecM und const unsigned int N; vertauscht werden?

    Ja. Die Reihenfolge der Initialisierungsliste entspricht der Reihenfolge der Member.



  • out schrieb:

    Müssen etwa vektor<int> vecM und const unsigned int N; vertauscht werden?

    Ja. Die Reihenfolge der Initialisierungsliste entspricht der Reihenfolge der Member.

    Und wieso genau müssen vector<int> vecM und const undigned int N vertauscht werden?



  • Weil sonst in der Initialisierungsliste der Konstruktor von std::vector<int> für vec mit einem uninitialisiertem N aufgerufen wird.



  • Swordfish schrieb:

    Weil sonst in der Initialisierungsliste der Konstruktor von std::vector<int> für vec mit einem uninitialisiertem N aufgerufen wird.

    Aber als erstes wird doch vec aufgerufen.., oder?



  • user637 schrieb:

    Swordfish schrieb:

    Weil sonst in der Initialisierungsliste der Konstruktor von std::vector<int> für vec mit einem uninitialisiertem N aufgerufen wird.

    Aber als erstes wird doch vec aufgerufen.., oder?

    Leider



  • out schrieb:

    user637 schrieb:

    Swordfish schrieb:

    Weil sonst in der Initialisierungsliste der Konstruktor von std::vector<int> für vec mit einem uninitialisiertem N aufgerufen wird.

    Aber als erstes wird doch vec aufgerufen.., oder?

    Leider

    Wieso muss dann die Reihenfolge vertauscht werden, wenn vec als erstes aufgerufen wird..
    Kann ich leider nicht so nachvollziehen..



  • user637 schrieb:

    Wieso muss dann die Reihenfolge vertauscht werden, wenn vec als erstes aufgerufen wird..
    Kann ich leider nicht so nachvollziehen..

    Hat Swordfish schon gesagt: Weil es kein N gibt.



  • Wenn die Reihenfolge "falsch" ist, wird
    - vec mit N, das noch einen undefinierten Inhalt hat, initialisiert,
    - danach N mit 5 initialisiert.

    Die Reihenfolge der Initialisierung ist die Reihenfolge, in welcher die Variablen in deklariert werden. Es ist völlig unerheblich, ob du

    MeinVektor() : N(5), vec (N) { ... }
    // oder
    MeinVektor() : vec (N), N(5) { ... }
    

    schreibst.

    Das hier ist maßgeblich:

    // so wird erst vec, dann N initialisiert
    class MeinVektor {
      vector<int> vec;
      const unsigned int N;
      // ...
    };
    // so wird erst N, dann vec initialisiert
    class MeinVektor {
      const unsigned int N;
      vector<int> vec;
      // ...
    };
    

    Compiler warnen, damit man nicht ausversehen die Reihenfolge falsch macht.


Anmelden zum Antworten