我不明白为什么需要这样进行动态分配结构的初始化(使用共享的ptr) 只是通知我我正在使用C ++ 11
如果我们有这样的结构
struct Meme {
std::string s;
Meme* p;
}
以及随后的代码中,我需要使用shared_ptr为该结构动态分配内存,但是我需要对结构进行即时初始化。 为什么这样做呢?
std::shared_ptr<Meme> novi=std::make_shared<Meme>(Meme{imena.at(i),nullptr});
让我感到困惑的部分是这个:
std::make_shared<Meme>(Meme{imena.at(i),nullptr});
如果我们将shared_ptr设置为指向struct Meme,为什么我们需要再次声明初始化列表是针对struct Meme的
(Meme{imena.at(i),nullptr})
为什么这不起作用:
std::shared_ptr<Meme> novi=std::make_shared<Meme>({imena.at(i),nullptr});
也许这是初始化列表无法推断出它应该转换为struct Meme的原因,因为没有直接使用struct Meme(即使make_shared指向struct Meme)?
答案 0 :(得分:0)
make_shared
将参数转发给构造函数。
设为shared_ptr
分配并构造一个T类型的对象,将args传递给其构造函数,并返回一个拥有并存储指向它的指针(使用计数为1)的shared_ptr类型的对象。 >
这会从您使用Meme
创建的新实例中调用Meme{imena.at(i),nullptr}
的副本构造函数。
std::shared_ptr<Meme> novi=std::make_shared<Meme>(Meme{imena.at(i),nullptr});
使用make_shared
从转发的参数构造它的正确方法是在struct中创建构造器:
struct Meme {
std::string s;
Meme* p;
Meme(const std::string& s, Meme* p) : s(s), p(p) {}
};
std::shared_ptr<Meme> novi = std::make_shared<Meme>(imena.at(i),nullptr);
您还可以使用(默认)空构造函数创建一个实例,然后设置其成员:
struct Meme {
std::string s;
Meme* p = nullptr;
};
std::shared_ptr<Meme> novi = std::make_shared<Meme>;
novi->s = imena.at(i);