2017-08-29 3 views
1

Ich habe ein Szenario, in dem ich häufig Nicht-Zeiger-Variablen, einschließlich Objekte, verwende.Nicht-Zeiger-Variable in die Funktion als Verweis auf Zeiger übergeben

Ich möchte diese Variablen auf einen vorhandenen Satz von Daten aus einem Array setzen, aber ich möchte keine Soft-Copy, stattdessen möchte ich die Nicht-Zeiger-Variable direkt auf die Speicheradresse der anderen Variablen zeigen.

Dies ist ein einfaches Beispiel für Code für mein Dilemma.

struct User 
{ 
    unsigned int ID; 
    std::string Name; 

    User(int id, std::string name) 
    { 
     ID = id; 
     Name = name; 
    } 
}; 

User data[] = 
{ 
    User(2, "Jane Smith"), 
}; 

void ChangeUser(User& user) 
{ 
    user = data[0]; 
} 

int main() 
{ 
    User first; 
    ChangeUser(first); 

    return 0; 
} 

Wenn ich eine Funktion will, dass es zu einer neuen Adresse ändern kann, kann ich das nicht-Zeiger-Objekt als Zeiger auf ein Objekt übergeben.

void ChangeUser(User* user) 
{ 
    user = &data[0]; 
} 

int main() 
{ 
    User first; 
    ChangeUser(&first); 

    return 0; 
} 

Dies ändert jedoch nicht die Variable außerhalb der Funktion, da sie den Zeiger nach Wert übergibt. Was ich tun kann, ist einen Zeiger als Referenz übergeben, was bedeutet, wenn ich einen Zeiger übergeben, werden die Daten auch nach der Funktion geändert.

void ChangeUser(User*& user) 
{ 
    user = &data[0]; 
} 

Wenn ich jedoch mit einer Nicht-Zeiger-Variable versuche, bekomme ich diese Kompilierung Fehler, wo ich die Funktion aufrufen.

error C2664: 'void ChangeUser(User *&)' : cannot convert argument 1 from 'User *' to 'User *&' 

Wenn I wie unten eine Zeigervariable zu erstellen, wird der Compiler es akzeptieren und die Daten des Zeigers auf den Zeiger des Elements in der Anordnung festgelegt.

Wenn ich jedoch nicht-Zeiger-Variablen verwenden muss, gibt es eine Möglichkeit für mich, die gleiche Aufgabe zu erfüllen? Idealerweise möchte ich eine Benutzervariable als Mitglied einer Klasse behalten können, so dass lokale Referenzvariablen nicht verwendet werden können.

+0

"Wenn ich jedoch mit einer Nicht-Zeiger-Variable versuche, bekomme ich diesen Kompilierungsfehler, wo ich die Funktion anrufe." Bitte geben Sie den Code ein, der zu diesem Fehler führt ... – jpo38

+0

@ jpo38 Sie haben es getan. – user0042

+0

"* Ich möchte, dass die Non-Pointer-Variable direkt auf die Speicheradresse der anderen Variablen zeigt. *" Das klingt irgendwie unmöglich. – juanchopanza

Antwort

0

Der Code

User first; 
ChangeUser(&first); 

gibt effektiv eine const User*& Zeigerreferenz (R-Wert) an die Funktion (die ein nicht-const lvalue ist will), daher die Fehler.

Sie können die Adresse eines bereits zugewiesenen Objekts nicht ändern.

+0

Ah ich sehe, also kann das nur mit Zeigern funktionieren? –

+1

Es übergibt einen 'User *'. Und Sie können nicht die Adresse eines Objekts ändern, Stapel zugeordnet oder nicht. – juanchopanza

+0

@juanchopanza Ich weiß, deshalb schrieb ich _ "effektiv" _. Könnten Sie bitte einen besseren Wortlaut vorschlagen? – user0042

Verwandte Themen