我有一个场景,我经常使用非指针变量,包括对象。
我想将这些变量设置为数组中的现有数据集,但是我不想要软拷贝,而是希望非指针变量直接指向另一个变量的内存地址。 / p>
这是一个解决我的困境的简单示例代码。
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;
}
如果我想要一个可以将其更改为新地址的函数,我可以将非指针对象作为指向对象的指针传递。
void ChangeUser(User* user)
{
user = &data[0];
}
int main()
{
User first;
ChangeUser(&first);
return 0;
}
但是,这不会更改函数外部的变量,因为它会按值传入指针。我能做的是通过引用传入一个指针,这意味着如果我传入一个指针,即使在函数之后数据也会被更改。
void ChangeUser(User*& user)
{
user = &data[0];
}
但是,如果我尝试使用非指针变量,我会在调用函数时出现此编译错误。
error C2664: 'void ChangeUser(User *&)' : cannot convert argument 1 from 'User *' to 'User *&'
如果我按如下所示创建指针变量,编译器将接受它,并将指针的数据设置为数组中成员的指针。
但是,如果我必须使用非指针变量,有没有办法让我实现相同的任务?理想情况下,我希望能够将User变量保持为类的成员,因此不能使用本地引用变量。
答案 0 :(得分:0)
代码
User first;
ChangeUser(&first);
有效地将const User*&
指针引用(rvalue)传递给函数(它需要非const值),因此错误。
您无法更改已分配对象的地址。