2017-08-29 2 views
1

J'ai un scénario dans lequel j'utilise souvent des variables sans pointeur, y compris des objets. Je veux définir ces variables à un ensemble de données existant à partir d'un tableau, mais je ne veux pas de copie électronique, mais plutôt que la variable sans pointeur pointe directement vers l'adresse mémoire de l'autre variable.Passer une variable non-pointeur dans la fonction comme une référence au pointeur

Ceci est un simple exemple de code pour mon dilemme.

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; 
} 

Si je veux une fonction qui peut changer à une nouvelle adresse, je peux passer l'objet non-pointeur comme un pointeur vers un objet. Cependant, cela ne change pas la variable en dehors de la fonction, car elle passe dans le pointeur par la valeur. Ce que je peux faire est de passer un pointeur par référence, ce qui signifie que si je passe dans un pointeur, les données seront modifiées même après la fonction. Cependant, si j'essaye avec une variable sans pointeur, j'obtiens cette erreur de compilation où j'appelle la fonction.

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

Si je crée une variable de pointeur comme ci-dessous, le compilateur acceptera et définira les données du pointeur sur le pointeur de membre dans le tableau.

Cependant, si je dois utiliser des variables sans pointeur, y a-t-il un moyen pour moi d'accomplir la même tâche? Idéalement, je veux pouvoir garder une variable User en tant que membre d'une classe, donc les variables de référence locales ne peuvent pas être utilisées.

+0

"Toutefois, si j'essaie avec une variable sans pointeur, j'obtiens cette erreur de compilation où j'appelle la fonction." S'il vous plaît code postal menant à cette erreur ... – jpo38

+0

@ jpo38 Ils l'ont fait. – user0042

+0

"* Je souhaite que la variable sans pointeur pointe directement sur l'adresse mémoire de l'autre variable. *" Cela semble plutôt impossible. – juanchopanza

Répondre

0

Le code

User first; 
ChangeUser(&first); 

passe effectivement une référence de pointeur const User*& (rvalue) à la fonction (qui veut est une lvalue non-const), d'où l'erreur.

Vous ne pouvez pas modifier l'adresse d'un objet déjà alloué.

+0

Ah je vois, donc cela ne peut fonctionner qu'avec des pointeurs? –

+1

Il passe un 'User *'. Et vous ne pouvez pas changer l'adresse d'un objet, pile allouée ou non. – juanchopanza

+0

@juanchopanza Je sais, c'est pourquoi j'ai écrit _ "efficacement" _. Pourriez-vous proposer une meilleure formulation s'il vous plaît? – user0042