gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:39 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com