c++ - 如何阻止使用 std::make_shared<T>

标签 c++ class c++14 shared-ptr make-shared

我知道我可以通过将类的 operator new 设为私有(private)来防止自定义类及其后代的普通堆分配,但是有什么方法可以防止库的用户调用 std::make_shared 在自定义类(或其后代)上?显然,简单地将类中的 operator new 设为私有(private)并不能阻止它。

请注意,我不想完全阻止以任何方式创建共享指针,因为我仍打算通过调用静态方法为我的自定义类生成 std::shared_ptr生成器方法,但我仍然想阻止其他人尝试直接在我的类上调用 std::make_shared

编辑:

为了解决下面的查询,我的最终目标是一种灵活且可重用的机制,用于从原始指针中提取 shared_ptr。遗憾的是,std::enable_shared_from_this 在继承尤其是多重继承方面不是很友好。

此外,因为我打算将其用作使用 CRTP 的模板类中,这会使子类 T 需要显式创建它从 friend 继承的模板化父类,以便它可以访问其他私有(private)构造函数,这会使事情变得有些复杂。

最佳答案

这不是特定于 std::shared_ptr,但您可以将构造函数设为私有(private),这样可以强制类的所有实例从您的静态方法中生成。

#include <iostream>
#include <memory>

class Foo {
    private:
    Foo() = default;

    public:
    static std::shared_ptr<Foo> make() {
        return std::shared_ptr<Foo>(new Foo);
    }
};

int main() {
    //Foo f1;
    //auto f2 = std::make_shared<Foo>(); 
    //above does not work since the constructor is private
    auto h = Foo::make();
}

您还可以使用重复数据删除器建议并使用私钥使构造函数在类外部不可访问。

#include <iostream>
#include <memory>

class Foo {
    private:
    struct FooKey {};

    public:
    Foo(FooKey) {};

    static std::shared_ptr<Foo> make() {
        return std::make_shared<Foo>(FooKey{});
    }
};

int main() {
    //Foo f1{Foo::FooKey{}};
    //auto f2 = std::make_shared<Foo>(Foo::FooKey{}); 
    //above does not work since Foo::FooKey is private
    auto h = Foo::make();
}

关于c++ - 如何阻止使用 std::make_shared<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58015983/

相关文章:

c++ - 链表 : Can't access last node, 获取 R6010 (C++, VS2010)

c++ - 如何将大小变化结构的数组传递给 glsl 着色器

c++ - C++中的&&pointer或&*(pointer_to_pointer)是什么意思

c++ - 如何禁用 boost::wave 的部分概念检查?

c++ - 结构到 u_char 的转换

对象列表中的 Python 返回具有类属性集的第一个对象

python - kivy 使用附加类来存储来自多个屏幕的数据

c++ - C++ 中的类和异常处理

c++ - g++ 是否遵循 C++14 ISo 标准、编译器标志——它们到底是什么意思?

c++ - 给定从键到索引的映射,将值 (mapped_type) 从映射复制到 vector