[C++技巧] 在私有构造函数类上使用make_unique

简介

  之前遇到了一个难题,在工厂模式中,需要隐藏产品的构造函数,让用户只能通过工厂的函数获取新的产品。但是在返回智能指针时确出现了问题:make_unique和make_shared需要调用产品类的构造函数,但是却不能访问,我在网上找了很久,总算找到了靠谱的方法。

解决方法

不靠谱的方法

  第一时间想到的是一个不靠谱的解决方法,把make_unique设成友元类不就行了么?但是,这样最大的问题是,用户也能通过make_unique而不是工厂类构造产品了,这显然没有解决任何问题。

神奇的方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class ProductA
{
protected:
    ProductA() {}
};

class FactoryA
{
public:
    static std::unique_ptr<ProductA> create()
    {
        class ProductAHelper : public ProductA {};
        return std::make_unique<ProductAHelper>();
    }
};

  在这里可以看到,这里神奇的地方就在于用一个局部类继承产品类,生成一个子类的对象,而子类的智能指针可以自动退化成父类的智能指针。

  如果需要把构造函数设为私有而不是保护,则可以将工厂制定为友元类,这里就略过不表了。

总结

  C++果然学无止境,这样的代码写出来,我有了一种:“啊哈,我也开始使用黑魔法了!”的感觉。

从零开始搭建Wordpress个人博客

简介  简单的介绍一下自己这几天搭建LNMP+Wordpress的经历,踩的各种坑,还有总结出来的各种优化方案。会比较偏向于教学的感觉?但其实主要是好不容易基本上搭完了,写这么一篇记录一下,防止下次再像这样浪费人生。毕竟比我懂得多的大佬多的是。 背景  最近看着自己平均一个月支出10刀有余的两个服务器搁置在那里,有一种拿着打火机点纸币玩的感觉,所以决定在上面做点什么,所以就考虑要不要搭一个博客。正巧之前不知道什么时候脑子抽风买了个Avada主题,所以就考虑在性能相对较好的那个服务器上搭一个Wordpress博客。而事实证明,如果不是最近每天在家里过颠倒日夜,扭转乾坤,起床只要吃了饭就可以什么都不做的啃老生活的话,这个博客是绝对搭不起来的。 PS:舰C活动还没打完啊,喂,你在想什么啊,有那闲工夫快把舰C活动打了。 重装系统  这部分其实没有什么好讲的,因为之前的VPS里也没有什么重要的东西,在vps的管理页面一键重装为CentOS8,另一台装的是CentOS Stream,可以相对体验一些新的东西,不过毕竟是CentOS,官方源里不太会有非常新的东西,差别不会很大,也许在升级下个大版本比如说CentOS9什么的时候就能看出CentOS Stream的优势了也说不准。  顺便和不清楚CentOS Stream的人讲一下,这是和CentOS8一起推出的第一个所谓的CentOS家族的“滚动发行”的系统,软件包会比RHEL上游的新,比Fedora的稳定。如果打个比方的话,RHEL/CentOS是Stable,CentOS Stream是Beta,Fedora是Alpha这种感觉吧。不过既然它是滚动版本,我就有足够的理由相信在下一个CentOS大版本发行的时候它也能平滑升级,大概就是这样。 MySQL(MariaDB)  先讲数据库,因为这里是遇到坑最少的地方。我这次选择安装的是MariaDB,倒不是因为什么开源信仰之类的,单纯就是因为一直用的都是这个而已。而且MariaDB也有商业服务,可以相信它的安全性和稳定性。  进入正题,最简单的方法,从官方AppStream源进行安装。 1 sudo dnf install mariadb  但是我们建博客是为了稳定吗?是为了写博客吗?不是,是为了折腾,所以我们当然不能满足于这样就结束。我们一定要装最新版!  MariaDB官网给许多发行版都提供了预编译的软件包,其中就包括给CentOS8的dnf(yum)源。打开Setting up MariaDB Repositories这个官方提供的链接,选择自己的系统加版本,然后按着提示做就好。顺便记得在安装时检查一下GPG Key是否匹配。  安装完了MariaDB,还需要进行初期配置,执行: 1 sudo mysql_secure_installation  然后按提示操作就好,没什么难度。需要注意的是,配置中有一项仅允许unix socket连接的选项,推荐打开以微弱的增加安全性。 PHP 安装  Fuck PHP,这个东西编译起来是真的费劲,我有一半的时间都花在安装PHP上了。这里列出我个人基于LNMP与Wordpress以及Avada主题的编译选项。 1 ./configure --with-curl --enable-exif --enable-gd --with-webp --with-jpeg --with-freetype --enable-gd-jis-conv --enable-mbstring --with-mysqli --with-sodium --with-openssl --with-zip --with-zlib --enable-ftp --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-fpm-systemd --disable-short-tags --with-libdir=lib64  我需要提醒的是,这个编译选项仍然不是完美的,因为有一些选项我仍然不知道究竟有没有用,but,it works。 [阅读全文]