structName *& als Parameter Sinn?



  • Hallo,

    und zwar habe ich folgendes gesehen bzw. auch schon selbst verwendet ohne den eigentlichen Sinn dahinter zu verstehen und zwar:

    void fkt(structName *& pStruct)
    {
    pStrucht->.....
    }

    Aber mir verschließt sich der eigentliche Sinn dahinter, ich habe doch schon durch (structName& pStruct) eine Referenz auf die Sturktur und könnte diese Verändern ohne den lästigen -> mitschleppen zu müssen.

    Gibt es dahinter einen tieferliegenden Sinn noch einen Zeiger mit einzubauen?

    Und könnte man einen solchen *& Parameter auch irgendwie const machen? Also in etwa void fkt(const structName *& pStruct) um zu verhindern das an der übergebenen Struktur etwas verändert werden kann? Konkret wird in einer Funktion nämlich nur 'ausgelesen' und nichts verändert.

    Vielen Dank im Voraus
    Andreas



  • Und hier noch eine interessantere Frage für mich in diesem Zusammenhang, wieso funktioniert das hier nicht:

    class XYZ
    {
    public :
    
    	struct hallo
    	{
    		int x;
    	};
    
    	void printHallo(void) const
    	{
    		printHallo(Welt);
    	}
    
    private:
    
    	void printHallo(hallo *& pHallo)
    	{
    		cout << pHallo->x;
    	}
    
    	h
    

    Fehlermeldung lautet ständig:

    Fehler 1 error C2663: 'XYZ::printHallo': für 2 Überladung(en) gibt es keine zulässige Konvertierung für den this-Zeiger h:\Programmierung II\Spielwiese\Spielwiese\spiel.cpp 16

    Das verstehe ich einfach nicht.



  • dieses beispiel veranschautlicht eine möglichkeit der anwendung.
    natürlich kann man auch pointer auf pointer verwenden.

    der pointer (da als referenz übergeben) wird von &x auf &y umgebogen.

    int x = 10;
    int y = 20;
    
    void func(int *& pint)
    {
     pint = &y;
    }
    
    int main(int, char**)
    {
     int* pint = &x;
     printf("%d\n", *pint); // 10
    
     func(pint);
     printf("%d\n", *pint); // 20
    }
    


  • class XYZ
    {
    public:   
        struct hallo_s
        {
            unsigned int x;
            hallo_s() : x(0) {}
        };
    
        void print_hallo() const
        {
            print(m_item);
        }
    
    private:
        void print(const hallo_s& hallo) const
        {
            std::cout << hallo.x << std::endl;
        }
    
    private:
        hallo_s m_item;
    };
    

    ? so wäre es sinniger ^^



  • Anders gesagt: T*& macht Sinn als Typ eines Output Parameters (OUT oder IN, OUT), aber keinen Sinn als Typ eines Input Parameters.



  • Wow danke, jetzt langsam verstehe ich was C++ hier treibt bzw. der Code den ich vor die Nase gesetzt bekommen habe.

    Mal schauen ob ich es so zum laufen kriege.

    Ciao
    Andreas



  • yup, für out/inout parameter für pointer notwendig

    wobei out/inout verhalten kann man auch mit pointerpointern machen

    int x = 10;
    int y = 20;
    
    void func(int** ppInt)
    {
     if (ppInt != NULL) //notwendiges übel, bei pointern weiss man nie ob's null sind
      *ppInt = &y;
    }
    
    int main(int, char**)
    {
     int* pInt = &x;
     printf("%d\n", *pInt);
    
     func(&pInt);
     printf("%d\n", *pInt);
    
     func(NULL); // potentielles !!EEK!!
    }
    

    achtung. konstrukte wie diese hier sind gefährlich 😃

    void func(sometyp*& ptyp)
    {
     ptyp = new sometyp; //funktion fungiert als datenquelle, und überlässt das löschen dem clientcode
    }
    

Anmelden zum Antworten