Objectverwalltungsklasse



  • huhu,

    möchte nur wissen ob folgendes eine gute idee ist, oder ob man das besser/anders machen sollte?

    class All_A // sollte nat. singeltone sein
    {
    	friend A;
    
    private:
    	vector <A> die_as;	
    public:
    	All_A()
    	{
    		A::handler=this;
    	}
    
    	insert_A(A *a){...}
    	delete_A(A *a){...}
    
    };
    
    class A
    {
    private:
    	static All_A *handler;
    
    public:
    	A()
    	{
    
    		//...
    
    		handler->insert_A(this);
    	}
    	virtual ~A()
    	{
    		handler->delete_A(this);
    
    	}
    
    	//....
    };
    


  • Was willst du damit bezwecken? Ohne Erklärung macht es für mich auf den ersten Blick nicht viel Sinn.



  • Shade Of Mine schrieb:

    Was willst du damit bezwecken? Ohne Erklärung macht es für mich auf den ersten Blick nicht viel Sinn.

    dachte das währe ersichtlich..

    naja, ich möchte dass immer wenn ein object A erzeugt wird dieses automatisch in einen Vector (All_A) gepackt wird, ohne das ich viel "schreiben" muss.

    Weil ich habe in meinen programm opetrationen wo ich alle As aufeimal gebrauche und mal nur einzeln.



  • xroads42 schrieb:

    naja, ich möchte dass immer wenn ein object A erzeugt wird dieses automatisch in einen Vector (All_A) gepackt wird, ohne das ich viel "schreiben" muss.

    Ah, jetzt verstehe ich.

    Ich würde All_A zu einem Singleton machen.
    Ansonsten ist es OK - nur All_A gefällt mir eben noch nicht.

    Was wenn ich ein A instanziiere bevor ich All_A instanziiert habe - oder 2 All_A instanziiere?



  • Shade Of Mine schrieb:

    xroads42 schrieb:

    naja, ich möchte dass immer wenn ein object A erzeugt wird dieses automatisch in einen Vector (All_A) gepackt wird, ohne das ich viel "schreiben" muss.

    Ah, jetzt verstehe ich.

    Ich würde All_A zu einem Singleton machen.
    Ansonsten ist es OK - nur All_A gefällt mir eben noch nicht.

    Was wenn ich ein A instanziiere bevor ich All_A instanziiert habe - oder 2 All_A instanziiere?

    schau mal denn kommentar hinter class All_A an 😉

    Edit:
    ich habe auch überlegt, dass ich All_A erst instanziiere wenn ich das erste objekt von A erzeuge.
    Nur wo soll ich dann den pointer auf All_A speichern, so dass ich von wo anders auch drauf zugreifen kann..
    Obwohl.. hmmmm



  • nu neu:
    so ok??

    class All_A
    {
    	friend A;
    
    private:
    	vector <A*> die_as;	
    private:
    	All_A()
    	{
    		A::handler=this;
    	}
    	~All_A();
    public:
    	insert_A(A *a){...}
    	delete_A(A *a){...}
    
    };
    
    class A
    {
    
    	friend All_A;
    private:
    	static All_A *handler;
    	static int count; // irgendwo mit 0 initialiesiert
    public:
    	A()
    	{
    
    		if(!counter)
    			handler=new All_A();
    
    		counter++;
    		handler->insert_A(this);
    	}
    	virtual ~A()
    	{
    
    		handler->delete_A(this);
    		count--;
    		if(!count)
    			delete handler;
    	}
    
    	//....
    };
    

    edit: dumme vertipper....

    Oder gehört der counter nach All_A??



  • xroads42 schrieb:

    schau mal denn kommentar hinter class All_A an 😉

    Oh, sorry. das habe ich überlesen.

    Der Counter gehört IMHO zu All_A



  • hmm, vielleicht lehne ich mich zuweit aus dem fenster, aber ist es nicht sinnloser overheat, objekte mittels eines normalen constructors zu erstellen, und dann eine kopie dieses objekts in ein array zu packen?

    vielleicht klappts ja mit diesem (pseudo)code:

    A* A::operator new(size t){
        if(All_A::handler==NULL){
            All_A::handler=new All_A();
        }
        return All_A::handler->insert()//hier wird dann ein neues objekt erzeugt und seine position zurückgegeben     
    }
    

    ich glaube, dass es so klappen müsste, bin jetzt nich so ganz mit dem new operator auf dem laufenden, wie die übergabe der konstruktorparameter des zu erstellenden A objekts in bezug auf new funktioniert...



  • Overhead und ctor oder im Deutschen Konstuktor

    Und du hast Recht, ich sehe darin auch deutlichen Overhead, eine mögliche Weise ist:

    vector<A*> vec;
    
    // Einfügen
    Klasse* a = new A();
    vec.push_back(a);
    
    // Am Ende dann
    for(vector<A*>::iterator it = vec.begin(); vec.end(); ++it)
        delete *a;
    

    Schafft keinen Overhead, aber eine explizite Löschung ist erforderlich.

    MfG Eisflamme


Anmelden zum Antworten