c++ - 基本访问中的工厂方法在派生中 protected 构造函数

标签 c++ constructor shared-ptr factory

我希望从 Initable 派生的所有对象在销毁时调用 terminate()。为此,我创建了一个带有自定义删除器的 shared_ptr

我的问题是我无法访问派生类的 protected 构造函数,以便在 Initable 工厂方法中创建实例。

应该保护构造函数,以防止在不使用工厂方法的情况下创建实例。

class Initable {
public:
    virtual void terminate() = 0;

    template<typename T, typename... Ts>
    static shared_ptr<T> make_initable(const Ts &... args) {
        return shared_ptr<T>(new T(std::forward<const Ts>(args)...), [] (Initable * aptr) {
            cout << "custom deleter" << endl;
        });
    }
};

class B : public Initable {
    friend class Initable;
// ...
};

我想避免将每个派生类都声明为友元,我该怎么做?

最佳答案

友元不是:

  • 对称。
  • 可传递的。
  • 继承。

我认为这让您可以选择帮助您的用户发现他错过了向 Initable 类声明友元。您不能为此使用模板特化,因为友元声明需要发生在类范围内,而模板声明需要发生在命名空间范围内。

一种方法是:

#define DECLARE_INITABLE \
    constexpr static bool is_Initable_friend = true;\
    friend class Initable;

class Initable {
public:
     virtual void terminate() = 0;

     template<typename T, typename... Ts>
     static shared_ptr<T> make_initable(const Ts &... args) {
        static_assert(T::is_Initable_friend, "Please call DECLARE_INITABLE in your class   declaration");

        return shared_ptr<T>(new T(std::forward<const Ts>(args)...), [] (Initable * aptr) {
             cout << "custom deleter" << endl;
        });
     } 
};

class B : public Initable {
//  DECLARE_INITABLE
     ...
};

关于c++ - 基本访问中的工厂方法在派生中 protected 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25977120/

相关文章:

c++ - 不支持 int64 的 libjson-rpc-cpp?

java - 面对构造函数静态 block 和代码块的执行顺序问题

javascript - 将回调传递给对象的方法

c++ - 将执行哪个构造函数?

ios - std::unique_ptr 作为 objective-c 中的 @property

c++ - 取多行输入,以逗号分隔,将每行存储到字符串数组中

c++ - nohup C++ fstream

c++ - 具有对象应为 const 的共享指针的函数调用

c++ - 创建条件变量的共享指针时的问题

c++ - 调试 libpng-1.2.46-2 Fedora Core 16 -- .PNG 前 8 位未通过 libpng