Problem mit Referenzen



  • hallo,
    ich versuche gerade, die Funktion der CAsyncSocket::GetPeerName bei mir einzubauen.
    Sieht so aus:

    CString name;
    UINT port;
    m_sServerSocket.GetPeerName(&name, &port);
    

    die "GetPeerName" ist in MSDN so definiert:

    BOOL GetPeerName( CString& rPeerAddress, UINT& rPeerPort );

    Leider bekomme ich Fehlermeldung:
    "Konvertierung des Parameters 1 von 'class CString *' in 'class CString &' nicht moeglich"

    Kann mir jemand sagen, wo ich Fehler gemacht habe?



  • Hallo,

    die Funktion erwartet Referenzen. Du übergibst jedoch Adressen ( & operator ).

    Bei Referenzen werden die Variablen direkt angegebn.

    BOOL GetPeerName( CString& rPeerAddress, UINT& rPeerPort );

    also:

    CString name;
    UINT port;
    m_sServerSocket.GetPeerName(name, port);
    

    Gruss
    Frank



  • EB schrieb:

    CString name;
    UINT port;
    m_sServerSocket.GetPeerName(name, port);

    ist falsch, die Variablen :name und port liefert die Funktion als Resultat zurück,
    und so, wie du meinst, werden die Variablen als Parameter an die Funktion übergeben.Originalvariablen ändern sich nicht, sollten aber.

    Eigentlich ist das ganz einfache Sache, jede Lehrbuch beschreibt die Parameterübergabe als Referenz so z.B. c++ in 21 Tagen :

    int a,b;
    MeineFunktion (&a, &b); // ändert die Ausgang Variablen

    Ich verstehe wirklich nicht, woher die Fehlermeldung kommt.
    Leute! Bitte, lass mich nicht hängen 🙄



  • Ob die Variablen geändert werden, liegt auch an der Typanganbe der Funktion:

    int func(int i);
    

    erwartet einen int und bekommt eine Kopie davon (die übergebene Variable ändert sich nicht):

    int val=4711;
    int res=func(val);
    
    int func(int* i);
    

    erwartet einen Pointer und kann die verzeigerte Variable ändern:

    int val=4711;
    int res=func(&val)
    

    (so dürfte es in deinem Buch gamcht worden sein)

    int func(int& i);
    

    erwartet eine Referenz (da gibst du nur den Variablennamen an) und kann die übergebene Variable ändern:

    int val=4711;
    int res=func(val);
    

    (diesen Fall hast du bei deiner GetPerName()-Methode)



  • Hi,

    EB schrieb:

    CString name;
    UINT port;
    m_sServerSocket.GetPeerName(name, port);

    roberto schrieb:

    ist falsch, die Variablen :name und port liefert die Funktion als Resultat zurück

    Ist es nicht!

    Gruss
    EB


Anmelden zum Antworten