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.
"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
@ jpo38 Sie haben es getan. – user0042
"* Ich möchte, dass die Non-Pointer-Variable direkt auf die Speicheradresse der anderen Variablen zeigt. *" Das klingt irgendwie unmöglich. – juanchopanza