mehrere Objekte eines Klassentyps sollen sich eine dynamische Variable teilen.



  • cl90 schrieb:

    Das prinzip von static in einer Klasse ist mir bekannt.
    Ich kann eine beliebige Variable damit zur Kompilierzeit festlegen, und alle Objekte dieser Klasse greifen auf die selbe Variable zu.
    - 100 objekte von typ X, aber nur 1x Variable im Speicher.

    ich würde gerne genau dieses verhalten habe, nur möchte ich die variable zur laufzeit ändern können. Aber wie?

    Du kannst doch zur Laufzeit eine static Variabel, über eine Methode oder direkt, ändern. Nur wenn sie noch dazu const ist, darfst du sie nur noch lesen.



  • Hier mal ein Beispiel von mir, ich hoffe ich habe alles richtig gemacht:

    #include <iostream>
    
    using namespace std;
    
    class MyClass
    {
    public:
        static int var_;
    };
    
    int MyClass::var_;
    
    int main()
    {
        MyClass my1, my2;
        my1.var_ = 42;
        cout << "my1.var_=" << my1.var_ << endl;
        cout << "my2.var_=" << my2.var_<< endl;
        my2.var_ = 23;
        cout << "my1.var_=" << my1.var_ << endl;
        cout << "my2.var_=" << my1.var_ << endl;
    
        return 0;
    }
    


  • Die statische Membervariable mit einer Instanz zu qualifizieren, sprich: my1.var_ zu schreiben, finde ich, ist unschön. Damit suggeriert man, dass var_ nicht-statisch ist. Also lieber MyClass::var_ . Ich hoffe, du verstehst 🙂



  • Dann hätte ich mir my1 my2 sparen können und der Effekt, dass man sieht dass von beiden Instanzen der gleiche Speicher genutzt wird, wäre für den Arsch. Ich weiß aber was du meinst, auch wenn ich noch am Anfang bin.



  • Ich hab mit dem TE gesprochen. Und bitte entspann dich mal, der Effekt wäre nicht für den Arsch, weil man nach wie vor sieht, dass die Variable unabhängig von den Instanzen (wenn es welche gibt) existiert, und außerdem implizierst du (ungewollt), dass man immer eine Instanz braucht, um die Variable anzusprechen.



  • Hörst dich an wie meine Kinder, die sagen immer "chill mal", muss ich mal probieren^^ Ja hast Recht, man braucht keine Instanz. Man kann auch ohne Instanz per MyClass::var_ = X drauf zugreifen.



  • Grasshopper schrieb:

    Hörst dich an wie meine Kinder

    Jo, und wenn Du erst mal ein paar Wochen hier dabei bist, dann merkst Du auch, wieso ...



  • Na, da bin ich ja mal gespannt. Ich hoffe ich halte es aus so lange C++ zu lernen, ohne ständig Spiele spielen zu müssen(siehe Signatur)^^



  • die klasse "leg" wird 6x erstellt. für 6 beine die ihre eigenen variablen haben, aber es soll bestimmte variablen geben die von allen beinen geteilt werden.
    welche die statisch sind, und welche die ich nachträglich noch ändern will.

    class leg 
    {
    	public:
    		leg(LPDIRECT3DDEVICE9& d3ddev, MeshData* lmesh);
    		leg(LPDIRECT3DDEVICE9& d3ddev, MeshData* lmesh, float posx, float posy, float posz);
    		~leg();
    		void			set_angle	(int servo, float angle);
    		void			set_angle	(float an1, float an2, float an3, float an4);
    		float			get_angle	(int servo);
    		void			set_pos		(float posx, float posy, float posz);
    		float			get_pos		(int axis);
    		float			get_length	(int part);
    		float			rad			(float angle);
    		void			draw_leg();
    
    	private:
    		void			m_refresh_transform();
    		float			m_angle[4];
    		float			m_pos[3];
    		D3DXVECTOR3		m_posVec[5];
    		D3DXMATRIX		m_matTransform[5];
    // ab hier soll alles von allen klassen geteilt werden.
    // derzeitig werden die D3DXMATRIXen aber nicht geteilt. da ich sie nach dem erstellen noch ändern muss.
    		static	float		m_length[4];
    		static	float		m_PI;
    		D3DXMATRIX			m_matRot90;
    		D3DXMATRIX			m_matUniSize;
    		D3DXMATRIX			m_matTransSO;
    		D3DXMATRIX			m_matTransVS;
    		D3DXMATRIX			m_matTransOS;
    		D3DXMATRIX			m_matTransUS;
    		LPDIRECT3DDEVICE9	m_d3ddev;
    		MeshData*			m_lmesh;
    };
    


  • Du kannst dein Variablen in eine struct speichern und jeder Instanz von leg einen Zeiger auf diese Struktur geben. Einfacher wird es nicht.


Anmelden zum Antworten