c++只在堆上构建对象
原文地址
要求:只允许在堆上建对象,即用共针/独针来创建对象.直觉方法:私有构造,提供静态方法:
构 挂名{
静 动 创建(){
中 造共<挂名>();//静态方法
}
私:
挂名(){}//私有
};
整 主(){
挂名 d{};//编译错误
动 针=挂名::创建();//@1
}
@1失败,是因为造共要访问私有构造函数.再改:
构 挂名{
静 动 创建(){
中 共针<挂名>(新 挂名());
}
私:
挂名(){}
};
整 主(){
//挂名 d{};//编译失败
动 针=挂名::创建();//好
}
这里,通过新来构造对象,可以访问私有构造函数.
造共比新性能好,这时,用友元.因为友可以访问私函数.改造为:
元<型名 T>类 令牌{
私:
令牌(){}
友 T;
};
//不必声明为内部类.内部类一点优势都没有啦.
构 挂名{
静 动 创建(){//挂名可访问令牌.
令牌<挂名>t;中 造共针<挂名>(t);
}
挂名(令牌<挂名>):挂名(){}
//这是通过该令牌来构造.造共调用该构造函数.
私:
挂名(){}
};
空 主(){
//挂名 d{};//编译失败
//挂名 d(令牌{});//失败
动 针=挂名::创建();//好
}
令牌,有两个作用:1,避免在栈上构造,2,提供构造函数.对造独针也是一样.类似实现.
而实际需求,则是如果一个对象从允许从此共享(enable_shared_from_this)中派生,如果要调用其从此共享(shared_from_this)方法,则必须为堆对象,如果为栈,则会崩溃.因而使用继承允许从此共享的对象时,要求其必须在堆上构建.
如果,要求只能在栈上构建呢?
Kean提供的另一方法:
构 挂名{
空 删除器(){删 本;}//通过其来释放.
私:
~挂名(){输出<<"析构挂名"<<行尾;}
//私有析构
};
整 主(){
//挂名 d;//编译失败
挂名*针=新 挂名();
针->删除器();
动 针1=共针<挂名>(新 挂名(),[](挂名*插入){插入->删除器();});//后面是自定义析构器.
}
将析构定义为私有,则不能在栈上构造,因为栈出域时要析构.不能访问,就有问题了.而在堆上,则由程序员控制析构函数.
声明友变参参考地址,这里的解法不很好.
结合这里,可以实现,只在栈上构建对象,即私有符号 新/删.
浙公网安备 33010602011771号