我希望从 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/