【发布时间】:2017-08-29 20:26:39
【问题描述】:
我有一个场景,我经常使用非指针变量,包括对象。
我想将这些变量设置为来自数组的现有数据集,但是我不想要软拷贝,而是希望非指针变量直接指向另一个变量的内存地址。
这是我的困境的一个简单示例代码。
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 *&'
如果我如下创建一个指针变量,编译器将接受它并将指针的数据设置为数组中成员的指针。
但是,如果我必须使用非指针变量,有没有办法让我完成同样的任务?理想情况下,我希望能够将用户变量保留为类的成员,因此不能使用局部引用变量。
【问题讨论】:
-
“但是,如果我尝试使用非指针变量,我会在调用函数时收到此编译错误。”请发布导致此错误的代码...
-
@jpo38 他们做到了。
-
"我希望非指针变量直接指向另一个变量的内存地址。"这听起来有点不可能。
-
“我想要一个可以将其更改为新地址的函数” 您不能更改堆栈分配对象的地址。
标签: c++ arrays pointers reference pass-by-reference