Referenz auf auf Objekt, als Funktionsparameter



  • Hallo! 🙂

    Wenn ich ein Objekt in einer Funktion verwenden möchte und nicht kopieren möchte, überge ich es als Referenz.

    _ErrType	dosomething	(string& file, _IndexTree& indexTree);
    

    Aber wie bekomme ich eine Referenz aus einer Funktion heraus? ohne return val?

    also z.b.:

    _ErrType		_IndexTree	::	searchSimple(_IndexCluster* ic, _u32 block) {
    		if(m_MainCluster.at(0).getSize() >= block) {
    			ic = &(m_MainCluster.at(0));
    			return _ErrType::HasMatch;
    		} else {
    			return _ErrType::NoMatch;
    		}
    }
    // Das macht z.b. gar nichts. Der übergebene Pointer ic, ist nach dem Funktionsaufruf immer noch null. 
    // Verständlich... ist irgendwie call bei value für eine Adresse...
    
    _ErrType		_IndexTree	::	searchSimple(_IndexCluster& ic, _u32 block) {
    		if(m_MainCluster.at(0).getSize() >= block) {
    			ic = m_MainCluster.at(0);
    			return _ErrType::HasMatch;
    		} else {
    			return _ErrType::NoMatch;
    		}
    }
    // Und das hier kopiert mir das ganze m_MainCluster.at(0) in die referenz ic.
    // Ich hab nach der Funktion zwar den Baum, aber hab auch eine Sekunde unnötig verschenkt beim koppieren...
    

    ich möchte letztendlich sowas machen:

    _IndexCluster* head;
    		if(m_IndexTree.searchSimple(head, blockNum) == _ErrType::HasMatch) {
    			head->WhatEverfunction();
    		}
    


  • _Wenn _du _den. _Pointer _ãndern
    _willst, _musst _du _halt
    _den _Pointer als _Referenz übergeben.



  • manni66 schrieb:

    _Wenn _du _den. _Pointer _ãndern
    _willst, _musst _du _halt
    _den _Pointer als _Referenz übergeben.

    Danke...



  • @cl90: Unterstrich+Großbuchstabe am Anfang ist reserviert -> darfst Du nicht verwenden.
    Genauso doppelte Unterstriche und allgemein Unterstrich am Anfang im globalen Namensraum.



  • Ja, das haben wir ihm in einem anderen Thread auch schon gesagt. Aber in seinem Projektteam ist das so vorgeschrieben.



  • m(


  • Mod

    _ErrType        _IndexTree  ::  searchSimple(_IndexCluster* ic, _u32 block) {
            if(m_MainCluster.at(0).getSize() >= block) {
                ic = &(m_MainCluster.at(0));
                return _ErrType::HasMatch;
            } else {
                return _ErrType::NoMatch;
            }
    }
    

    Diese konkrete Funktion lässt sich umschreiben, ohne Referenzen auf Zeiger zu verwenden. Und zwar in dem du auf eine Enumeration verzichtest und den Zeiger zurückgibst. Für den Fall, dass es keinen Match gibt, gibst du einen Nullzeiger zurück.

    _IndexCluster* _IndexTree::searchSimple( _u32 block )
    {
            if(m_MainCluster.at(0).getSize() >= block)
                return &m_MainCluster.at(0);
    
            return nullptr; // Bzw. NULL in C++03
    }
    

    Und dann schreibst du einfach

    if( auto head = m_IndexTree.searchSimple(blockNum) ) // Oder _IndexCluster* in C++03
       head->WhatEverfunction();
    


  • Skym0sh0 schrieb:

    Ja, das haben wir ihm in einem anderen Thread auch schon gesagt. Aber in seinem Projektteam ist das so vorgeschrieben.

    Ein Kündigungsgrund, oder?



  • Vielleicht sind sie ja genau dafür reserviert? 🙂


Log in to reply