Variant-Zuweisungoperator



  • Hi,

    ich habe eine Variantklasse, die verschiedene Werte speichern kann: String, float, long und bool. Die Werte werden dabei in einer union gespeichert und in einer enum wird immer gespeichert, wie der Wert der union zu interpretieren ist.

    Die Frage ist nur, was ein Zuweisungoperator zurückliefern soll, z.B. der für einen long:

    const Variant& Variant::operator =(long lLong)
    {
    	GUARD;
    
    	if (m_Type == TYPE_STRING)
    		delete m_pString;
    
    	m_Type = TYPE_LONG;
    	m_lLong = lLong;
    	return *this;
    
    	UNGUARD;
    }
    

    Wie man sieht, gibt er im Moment die eigene Instanz als Referenz zurück, um Sachen wie Variant = Variant = Long möglich zu machen. Zuweisungen wie Long = Variant = Long werden dadurch aber sehr umständlich bis unmöglich (es gibt zwar einen operator long(), wodurch sie theoretisch möglich werden, aber sehr langsam).

    Die Frage ist nun: Was fändet ihr besser/bequemer: Einen Variant& zurückgeben oder den Wert, der grade gesetzt wurde?

    EDIT: Codetag auf C++ gestellt.

    ChrisM



  • int i,a,v;

    i = a = v;

    Im zweifelsfall so realisieren wie es ints machen.



  • ChrisM schrieb:

    const Variant& Variant::operator =(long lLong)
    {
    	GUARD;
    
    	if (m_Type == TYPE_STRING)
    		delete m_pString;
    	
    	m_Type = TYPE_LONG;
    	m_lLong = lLong;
    	return *this;
    
    	UNGUARD;
    }
    

    Für was stehen GUARD; bzw. UNGUARD; welches nach dem return steht,
    und so imho erst garnicht aufgerufen wird (oder sehe ich da was falsch ?)

    Devil



  • kurze frage:
    was stellt das UNGUARD _nach_ dem return da?

    zum problem:
    da
    long l;
    Variant v(7);
    l=v;

    ja funktioniert sehe ich kein problem darin

    bei
    long1=var=long2;
    einen Variant zurueck zu geben...



  • OK, danke.

    Wegen GUARD und UNGUARD, diese dienen dem Stack Tracing:

    #ifdef _DEBUG
    namespace AGE { AGEAPI void traceFunction(const char*); }
    #define GUARD try {
    #define UNGUARD } catch(...) { AGE::traceFunction(__FUNCTION__); throw; }
    #endif
    

    ChrisM



  • ChrisM schrieb:

    OK, danke.

    Wegen GUARD und UNGUARD, diese dienen dem Stack Tracing:

    #ifdef _DEBUG
    namespace AGE { AGEAPI void traceFunction(const char*); }
    #define GUARD try {
    #define UNGUARD } catch(...) { AGE::traceFunction(__FUNCTION__); throw; }
    #endif
    

    ChrisM

    Das ist gar nicht mal ungeschickt 😕



  • Nein, was erwartest du von mir 😃

    So krieg ich immer beim Exceptionwurf (also immer im Fehlerfall) einen kompletten Stack Trace. Bei mir werden die Makros zwar nur im Debug Mode gesetzt, aber das kann man gut ändern, denn: Wird keine Exception geworfen, d.h. es tritt kein Fehler auf, verursacht das System kaum Overhead, solang man aus den ganz kleinen Funktion (Get*()-Methoden z.B. oder solche, die eh inline sind) nicht guarded.

    ChrisM


Anmelden zum Antworten