gpt4 book ai didi

c++ - vector::push_back 从 const Type* 到 type* 的转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:18:40 25 4
gpt4 key购买 nike

vector::push_back 的签名是:

void push_back (const value_type& val);

这意味着它负责不破坏 val

我的职能是:

Result User::addFriend(const User* newFriend)
{
// check that newFriend is valid and is not already a friend
if (newFriend == NULL || isFriend(newFriend)) return FAILURE;
friends_.push_back(newFriend);
friendsNum_++;
return SUCCESS;
}

当我编译 .c 文件时出现编译错误:

invalid conversion from 'const User*' to 
std::vector User*::value_type
  1. 如果 push_back promise 不更改 val,为什么我们会收到此错误?

  2. 克服错误的正确且简洁的方法是什么?也许是 const_cast

谢谢!

用户.h:

class User {
...
public:
vector<User*> friends_;
...
}

最佳答案

您正在存储一个指针 vector :

std::vector<User*> friends_;

但是,这种方法存在一个问题。请注意,这些指针不是 const User*:任何有权访问 friends_ 的人都可以自由修改 User

这里的vector中的类型参数是User*,不是User,也就是说value_type ≡ User。因此,这条线

void push_back (const value_type& val);

应该这样解释:

void push_back (const User*& val);

请注意 the syntax is a bit misleading here ;一个更清晰的方式来看待它是这样的:

void push_back (User *const &val);

const 修改左侧的内容: 它防止指针被更改,但它不会阻止底层的 User 本身不会被改变。

因为 const 只影响指针而不影响 User,传入 const User* 会违反契约:

Result User::addFriend(const User* newFriend){

friends_.push_back(newFriend);

}

你不能这样做。由于 addFriend promise 不会阻止 User 被更改,因此将其存储到 non-const User* 的 vector 中> 将允许任何有权访问 vector 的人随意修改 User

可能的解决方案:

  • addFriend 使用 User* 而不是 const User*。更好的是:除非你有充分的理由不这样做,否则请使用引用。
  • friends_ 更改为使用 const User* 而不是 User*。更好的是:直接存储 User 而不是作为指针。
  • 复制用户

关于c++ - vector::push_back 从 const Type* 到 type* 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27725290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com