我对 C++ 比较陌生,这似乎是一个菜鸟问题,但我无法使用互联网上的其他资源来解决它。
我正在尝试从引用创建一个shared_ptr。我有以下内容Book
class:
#include <memory>
#include "Author.hpp"
class Book
{
public:
void setAuthor(const Author& t_author);
private:
std::shared_ptr<Author> m_author;
}
这是我的Author
class:
#include <memory>
class Book;
class Author
{
public:
void addBook(const Book& t_book);
private:
std::vector<std::weak_ptr<Book>> m_books;
}
我尝试实施Book::setAuthor
像这样的方法:
void Book::setAuthor(const Author& t_author)
{
m_author = std::shared_ptr<Author>(&t_author);
}
但如果我尝试编译它,我会得到:
从 const Author* 到 Author* 的转换无效
从 sizeof 到 const 的转换无效
你能告诉我我的代码有什么问题吗?我也尝试过同样的操作weak_ptr
但这也行不通。
不过,你的错误源于这样一个事实:std::shared_ptr<Author>
使用中的构造函数期望Author*
,但是表达式&t_author
结果为类型对象const Author*
还有一个错误的地方:
void Book::setAuthor(const Author& t_author)
{
m_author = std::shared_ptr<Author>(&t_author);
}
想象一下打电话book.setAuthor(Author("Herb Sutter"));
,你将会有一个悬垂指针因为t_author
该函数完成后将不复存在。
您需要将对象复制或移动到您的std::shared_ptr
实例。使用std::make_shared<T>
来创造你的std::shared_ptr<T>
尽可能的对象。
void Book::setAuthor(const Author& t_author)
{
m_author = std::make_shared<Author>(t_author);
}
更好的是:
void Book::setAuthor(Author t_author)
{
m_author = std::make_shared<Author>(std::move(t_author));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)