【问题标题】:error while passing const pointer as parameter将 const 指针作为参数传递时出错
【发布时间】:2016-04-15 05:57:11
【问题描述】:

我正在尝试更正一段 C++ 代码。 (它是为此目的而编写的,错误也是如此......)

错误:从 'const Book*'std::vector<Book*>::value_type {aka Book*}' 的无效转换 [-fpermissive]

在这个方法中

void Bibliography::addBook(const Book *newBook)
{
    books.push_back(newBook);
}

向量定义为

std::vector<Book *> books;

现在我的主要问题是,const 能达到多远?是说“这个函数不能修改newBook”还是让vector中的元素也变成const?

基于该答案,我是否必须删除 const,或者是否有其他方法可以解决此问题?

【问题讨论】:

  • 如果我对 const 的理解正确,这意味着这本书本身就是 const 吗?在这种情况下不,这本书是可编辑的
  • 是的,这行得通,谢谢兄弟

标签: c++ pointers parameters reference constants


【解决方案1】:

来自 cmets:

std::vector&lt;const Book *&gt; books; 可以吗?

不,这本书是可编辑的

如果要压入向量中的指针book 保持可变,则需要从addBook 的参数类型中删除const 限定符。否则,指针传递的book对象必须被视为const

还有其他方法可以解决这个问题吗?

我建议使用共享或唯一 smart 指针向量代替常规指针向量。这将帮助您自动管理内存:

std::vector<std::unique_ptr<Book>> books;

Unique pointers 将在 Book 对象从向量中移除时释放内存。

【讨论】:

  • 如果我将这本书添加到多个向量中,这是否有效?还是在这种情况下我应该使用共享指针?
  • @Wouter 正确,如果你是在不同的容器中添加对象,你需要使用std::shared_ptr&lt;T&gt;来代替。
  • 但是,如果我使用const Book 作为向量元素,我仍然可以更改原始对象来更新向量吗?我现在对此有点困惑。 (我想直接改,不经过向量)
  • @Wouter 如果将const 指针存储在向量中,您仍然可以使用原始的非const 指针来修改对象。只有当您通过向量时,才会阻止您修改 Book 或调用其任何非const 成员函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 2018-05-14
  • 2020-11-08
相关资源
最近更新 更多