c++只在堆上构建对象

原文地址
要求:只允许在上建对象,即用共针/独针来创建对象.直觉方法:私有构造,提供静态方法:

构 挂名{
    静 动 创建(){
      中 造共<挂名>();//静态方法
    }:
    挂名(){}//私有
};

整 主(){
  挂名 d{};//编译错误
  动 针=挂名::创建();//@1
}

@1失败,是因为造共要访问私有构造函数.再改:

构 挂名{
    静 动 创建(){
      中 共针<挂名>(新 挂名());
    }:
    挂名(){}
};

整 主(){
  //挂名 d{};//编译失败
  动 针=挂名::创建();//好
}

这里,通过构造对象,可以访问私有构造函数.
造共性能好,这时,用友元.因为可以访问私函数.改造为:

<型名 T>类 令牌{:
    令牌(){}
    友 T;
};
//不必声明为内部类.内部类一点优势都没有啦.
构 挂名{
    静 动 创建(){//挂名可访问令牌.
        令牌<挂名>t;中 造共针<挂名>(t);
    }
    挂名(令牌<挂名>):挂名(){}
    //这是通过该令牌来构造.造共调用该构造函数.:
    挂名(){}
};

空 主(){
  //挂名 d{};//编译失败
  //挂名 d(令牌{});//失败
  动 针=挂名::创建();//好
}

令牌,有两个作用:1,避免在栈上构造,2,提供构造函数.对造独针也是一样.类似实现.
而实际需求,则是如果一个对象允许从此共享(enable_shared_from_this)中派生,如果要调用其从此共享(shared_from_this)方法,则必须为堆对象,如果为,则会崩溃.因而使用继承允许从此共享的对象时,要求其必须在堆上构建.
如果,要求只能在上构建呢?
Kean提供的另一方法:

构 挂名{
    空 删除器(){删 本;}//通过其来释放.:
    ~挂名(){输出<<"析构挂名"<<行尾;}
//私有析构
};

整 主(){
    //挂名 d;//编译失败
    挂名*=新 挂名();->删除器();
    动 针1=共针<挂名>(新 挂名(),[](挂名*插入){插入->删除器();});//后面是自定义析构器.
}

将析构定义为私有,则不能在栈上构造,因为时要析构.不能访问,就有问题了.而在上,则由程序员控制析构函数.
声明变参参考地址,这里的解法不很好.
结合这里,可以实现,只在栈上构建对象,即私有符号 新/删.

posted @ 2021-01-28 16:49  zjh6  阅读(29)  评论(0)    收藏  举报  来源