我无法理解如何shared_ptr存储我给它的删除器.
最初,使用a shared_ptr<int>,我认为它可能会使用a std::function<void(int*)>,但我可以作为删除器给出任何类型的函数(或可调用对象),只要第一个参数是a int*.
怎么shared_ptr办呢?
我很抱歉,如果这是一个愚蠢的问题,我是C++的新手,请原谅我!
编辑:问题是:我怎么能做那样的事情?我该怎么用?任何例子?或者这是一个非常高级的话题?
例如,我有这两个类(来自C++ Primer的练习):
class Message{
set<Folder> folders;
public:
void addFolder(Folder f);
}
class Folder{
set<Message> messages;
public:
void addMessage(Message m);
}
Run Code Online (Sandbox Code Playgroud)
方法addFolder(等于addMessage)是这样的:
void addFolder(Folder f){
folders.push_back(f);
f.addMessage(this);
}
void addMessage(Message m){
messages.push_back(m);
m.addFolder(this);
}
Run Code Online (Sandbox Code Playgroud)
问题是这样我将对这两个方法进行无限递归调用(文件夹添加消息,而不是消息添加文件夹并要求文件夹添加消息等).
我有两个解决方案:
1.在每个返回bool的类中有一个公共成员,该值表示给定的消息/文件夹是否在对象的集合中:
void addFolder(Folder f){
folders.push_back(f);
if(!f.search(this)){
f.addMessage(this);
}
}
void addMessage(Message m){
messages.push_back(m);
if(!m.search(this)){
m.addFolder(this);
}
}
Run Code Online (Sandbox Code Playgroud)
这应该工作,但每次我必须控制该设置两次.
另一个解决方案是在每个类中都有一个私有成员,只添加文件夹/消息而不要求另一个添加它.然后把它交给班级朋友.
class Message{
friend class Folder;
set<Folder> folders;
public:
void addFolder(Folder f);
private:
void insertFolder(Folder f){ folders.push_back(f);}
}
class Folder{
friend class Message;
set<Message> messages;
public:
void …Run Code Online (Sandbox Code Playgroud) 我试图编译:
int &&a=3;
int &b=a;
Run Code Online (Sandbox Code Playgroud)
它的工作原理.我知道"a"是一个左值,但为什么我可以将"rvalue to int"绑定到"对int的lvalue引用(而不是对int的rvalue引用)"?这样,我可以改变临时值,3:
b=5 //changing the value of the temporary bound to the rvalue reference
Run Code Online (Sandbox Code Playgroud)
这个tecnique用于std :: forward,所以我认为这是一个标准的行为.对int的rvalue引用是否被视为存储临时的简单int左值?如果没有,你如何解释绑定?
假设我有一个名为Foo的类,带有复制赋值运算符,我认为这样:
Foo() = Foo();
Run Code Online (Sandbox Code Playgroud)
是不被允许的,因为我认为(对不起,再次)Foo()是一个右值(所以我不能分配给它),是一个临时对象.显然,我试图使这个代码工作,它正常工作,显示一些字符串,以验证我的程序正确使用复制赋值运算符.
我错了吗?或者这是一种错误?有什么用处?
c++ ×4
rvalue ×2
constructor ×1
forward ×1
friend ×1
function ×1
generics ×1
lvalue ×1
performance ×1
reference ×1
shared-ptr ×1
temporary ×1