无意中复制参数

时间:2016-02-09 06:47:51

标签: c++ arrays pointers pass-by-reference

我正在尝试为我的AddItem创建DeleteItemarray<Email, MAX_SIZE>函数,名为ulist

问题是,它正在创建变量的本地副本并添加它。

我是指针的新手,所以这可能是一个非常简单的错误,但是现在大约一个小时让我感到沮丧。

以下是代码:

void UnsortedList::AddItem(Email &item)
{
    cout << "Going to add " << &item << endl;

    list[Length] = item;

    cout << "Added " << &list[Length] << endl;
    Length++;
}

来自司机:

Email e1("sender", "content");
UnsortedList ulist;
ulist.Add(e1);

输出:

Going to add 0018F6FC
Added 0018D09C

2 个答案:

答案 0 :(得分:2)

如果您希望list仅存储指向添加项的指针,请将其声明为const Email的指针向量:

std::vector<const Email*> list;

然后,使用其指针将每个新电子邮件插入向量:

void UnsortedList::AddItem(const Email &item) {
  list.push_back(&item);
}

但请注意:您需要在程序中确保Email对象的生命周期长于列表的生命周期,否则列表将包含指向已解除分配对象的无效指针。

答案 1 :(得分:0)

问题是list是一个Email的数组...而不是Email *的数组。因此,即使您将Email &传递给AddItemEmai也会将list复制到array<Email *, MAX_LENGTH]> list;

相反,你会想要这样的东西:

list[Length] = &item;

然后是作业;

def users_by_role(role):
    users = User.objects.all()
    ids = [user.id for user in users if user.role == role]
    return users.filter(id__in=ids)

除此之外别无选择。如果数组不存储指针,则在存储到数组中时必须进行复制。