dynamische arrays in klassen



  • Oder placement-new:

    #include <cstddef>
    #include <type_traits>
    #include <memory>
    #include <iostream>
    
    class player_t
    {
    	private:
    		std::size_t const num_numbers;
    		unsigned * numbers;
    
    	public:
    		player_t( std::size_t num_numbers )
    		: num_numbers{ num_numbers },
    		  numbers{ new unsigned[ num_numbers ]() }
    		{}
    
    		player_t( player_t & ) = delete;
    
    		~player_t() { delete [] numbers; }
    };
    
    class bingo_t
    {
    	private:
    		typedef std::aligned_storage< sizeof player_t, std::alignment_of< player_t >::value >::type player_storage_t;
    
    		std::size_t const num_players;
    		player_t * players;
    
    	public:
    		bingo_t( std::size_t num_players, std::size_t num_numbers )
    		: num_players{ num_players },
    		  players{ reinterpret_cast< player_t * >( new player_storage_t[ num_players ] ) }
    		{
    			for( std::size_t i = 0; i < num_players; ++i )
    				new ( players + i ) player_t( num_numbers );
    		}
    
    		bingo_t( bingo_t & ) = delete;
    
    		~bingo_t() {
    			for( size_t i = 0; i < num_players; ++i )
    				players[ i ].~player_t();
    
    			delete [] reinterpret_cast< player_storage_t * >( players );
    		}
    };
    
    int main()
    {
    	bingo_t bingo( 10, 5 );
    }
    


  • Swordfish schrieb:

    class player_t
    {
    	private:
    		std::size_t const num_numbers;
    		unsigned * numbers;
    
    	public:
    		player_t( std::size_t num_numbers )
    		: num_numbers{ num_numbers },
    		  numbers{ new unsigned[ num_numbers ]() }
    		{}
    
    		player_t( player_t & ) = delete;
    
    		~player_t() { delete [] numbers; }
    };
    

    Auch du hast jede Menge Anti-Pattern angesammelt (const Member, falsche Reihenfolge der Member, private nach class, Kopierkonstruktor mit non-const-Referenz, Ro4 verletzt, _t für Typen, Braced initialisierung, etc.)



  • auch du mein sohn schrieb:

    const Member, falsche Reihenfolge der Member, private nach class [...], _t für Typen, Braced initialisierung, etc.

    mhm. passt schon.

    auch du mein sohn schrieb:

    Kopierkonstruktor mit non-const-Referenz, Ro4 verletzt

    Aha? Was ist denn möglich was nicht sein dürfte?



  • Swordfish schrieb:

    auch du mein sohn schrieb:

    Kopierkonstruktor mit non-const-Referenz, Ro4 verletzt

    Aha? Was ist denn möglich was nicht sein dürfte?

    Wie viele Zeilen musst du ändern, um einen Move-Konstruktor hinzuzufügen?



  • Verrats mir ...



  • (unsinn-entfernt)



  • Du sorry, ich steh vermutlich auf diversen Leitungen herum ... was meinst?



  • Nix, vergiss es. Ich war geistig im falschen Thread.



  • Okay also ich habs jetzt. Ich hab jetzt einfach in der Spielerklasse einen Konstruktor ohne Argumente verwendet! So funktionierts dann.
    Und was diese Antipattern Fehler betrifft. Wird da denn bei mir als blutiger Anfänger schon so sehr drauf geschaut?


  • Mod

    Cabooze schrieb:

    Und was diese Antipattern Fehler betrifft. Wird da denn bei mir als blutiger Anfänger schon so sehr drauf geschaut?

    Im Prinzip ja. Erstens sieht man da dran, dass du vermutlich einen schlechten Lehrer hast und wahrscheinlich nur wenig Brauchbares und viel Falsches von ihm lernen wirst. Zweitens sind erfahrungsgemäß die Sachen, die du dir zu Anfang angewöhnst prägend für deinen späteren Stil und du kannst sie dir nur schwer abgewöhnen (es ist aber möglich, aber es ist viel Disziplin nötig). Denn wenn du später doch mal umlernen möchtest, dann bist du anderweitig schon viel weiter als diese Anfängerthemen und schreibst viel komplexere Programme als die typischen Anfängerübungen. Und dann wird es dir schwer fallen, dass du diese (für dich) bewährten Techniken nicht mehr einsetzt, denn diese funktionieren aus deiner Sicht wenigstens, wohingegen du die "richtigen" Techniken nie richtig an einfachen Beispielen geübt hast und in den Programmen, die du dann schreibst, nicht richtig einzusetzen vermagst.


Anmelden zum Antworten