wie findet ihr diese Klasse?



  • tag schrieb:

    Shlo schrieb:

    tag schrieb:

    Nö. returnPointer ist nicht illegal, denn nur pointer ist const, nicht aber *pointer.

    Der this-Zeiger hat in einer const-Methode den Typ const T* const. Und wo soll jetzt *pointer nicht const sein?

    Der this-Zeiger ist in der Tat const T* const. Die Membervariable pointer wird aber nur von "U*" zu "U*const" und nicht etwa zu "const U* const" oder gar "const U*". Das const hinter der Funktion verhindert doch nur, dass sich *this ändert (also z.B. dass der Wert von pointer geändert wird), aber es wird nicht verhindert, dass sich der Wert, auf den pointer zeigt, sich ändert.

    Wo hast du den Schwachsinn her?



  • Habe ich jemals etwas anderes behauptet? Es geht hier doch nicht um this, es geht hier um pointer (jedenfalls aus der Version von gestern Abend, als es noch

    class VirtualAllocator{
    ...
        T* pointer;
    

    hieß).

    Ich meine:

    class C
    {
    char* pointer;
    char* returnPointer() const
    {
    return pointer;
    }
    };
    

    ist legal, da zwar this ein const Cconst ist, aber this->pointer nicht const char const, sondern char*const ist.



  • Shlo schrieb:

    Wo hast du den Schwachsinn her?

    Im Stroustrup unter Sektion 10.2.7.2 ist ein recht ähnliches Beispiel abgedruckt.



  • wenn pointer const sind, werden die objekte auf die der pointer zeigt automatisch auch const,btw,hab den code wiedermal geändert, gibtn paar operatoren und 1-2 fehler wurden entfernt.
    habs getestet, funzt wie ne eins,ist relativ schnell, und einfach zu handlen...was will man mehr? 😃



  • wenn pointer const sind, werden die objekte auf die der pointer zeigt automatisch auch const

    Nein. Tut mir leid, das stimmt einfach nicht. Was will man mehr? 😉



  • tag schrieb:

    Shlo schrieb:

    Wo hast du den Schwachsinn her?

    Im Stroustrup unter Sektion 10.2.7.2 ist ein recht ähnliches Beispiel abgedruckt.

    OK, bevor du weiter den Schwachsinn verbreitest solltest du genauer nachlesen: im 10.2.7.2 geht es mutable und das Beispiel sieht folgend aus:

    struct cache
    {
    	//...
    	std::string rep;
    };
    
    class Datum
    {
    public:
    	std::string stringRep() const
    	{
    		return p->rep;
    	}
    
    private:
    	cache* p;
    };
    

    Wo ist es denn ähnlich?



  • Optimizer schrieb:

    wenn pointer const sind, werden die objekte auf die der pointer zeigt automatisch auch const

    Nein. Tut mir leid, das stimmt einfach nicht. Was will man mehr? 😉

    habs getestet,deshalb musste ich ja das const vor dem pointer wieder wegmachen.
    ein T* GetPointer() const; konnte den pointer nicht zurückgeben, erst ein
    const T* GetPointer() const; ließ das zu.
    das hatte aber die wirkung, dass

    GetPointer->a=5;
    

    nicht funktioniert hat,weil ich keine const Objekte verändern darf(aufjedenfall sagt mir das der bcb)



  • Wie wärs mit

    T& operator=(const T& data)
    {
    	return *pointer=data;
    }
    
    bool operator==(const T& operand) const
    {
    	return *pointer==operand;
    }
    


  • Da hast du wohl eine andere Ausgabe bei der Hand als ich...
    *c lässt sich verändern, c nicht. Wenn du struct cache durch T ersetzt, dann sind wir genau da, wo wir angefangen haben.
    Bevor du mich weiter für schwachsinnig hälst, füttere deinen Compiler mit folgendem:

    #include <iostream>
    #include <string>
    using namespace std;
    
    struct cache {
    	bool valid;
    	string rep;
    };
    class Date
    {
    	cache* c;
    	void compute_cache_value() const
    	{
    		c->rep = "blabla";
    	}
    public:
    	Date();
    	string string_rep() const;
    };
    Date::Date()
    {
    	c = new cache;
    	c->valid = false;
    }
    string Date::string_rep() const
    {
    	if (!c->valid) {
    		compute_cache_value() ;
    		c->valid = true;
    	}
    	return c->rep;
    }
    int main()
    {
    	Date d;
    	cout << d.string_rep() << endl;
    	return 0;
    }
    

    Wenn du mich dann immer noch für schwachsinnig hälst, dann kann ich dir auch nicht helfen.



  • Ich versteh das ganze noch nicht so ganz vom Sinn her. Hauptsache du denkst dran, das 'T' deines 'VirtualAllocator's nur PODs sein können bzw. sollten.

    Ich stell mir gerade vor jemand schreibt

    VirtualAllocator<int> foo(3);
    

    in foo passt nichtmals ein int rein.

    wieso ich kein new/delete verwende? malloc scheint erstmal ähnlich schnell zu sein wie new/delete,ist aber für meine Zwecke erstmal viel einfacher.

    Versteh ich noch weniger:

    void * foo = malloc(20);
    
    void * bar = operator new(20);
    

    Warum ist das untere jetzt komplizierter, als das Obere? Wegen der paar Zeichen?

    Ist dein 'VirtualAllocator' überhaupt noch ein Allokator? Irgendwie ist das so 'ne Art Array auf dem Heap, nur das der Speicher nicht zwangsweise eine passende Größe baben muss. Der Allokator an sich ist ja die apselung für den Speicher. Deswegen finde ich den Namen doof.


Anmelden zum Antworten