在 类 中使用 unique_ptr 和受保护的析构函数
Use of unique_ptr in classes with protected destructors
我正在研究 Modern C++ Design 的基于策略的设计,我被困在下面的一个简单示例中,我试图在我的 std::unique_ptr
中使用 std::vector
模板化策略 class:
#include <memory>
#include <vector>
template <class T> struct MyPolicy {
MyPolicy() = default;
MyPolicy(std::size_t N) : myvec{std::vector<std::unique_ptr<T>>(N)} {
for (std::size_t i = 0; i < N; i++)
myvec[i].reset(new T(i));
}
// protected: // or, even, public:
// /*virtual*/ ~MyPolicy() = default;
private:
std::vector<std::unique_ptr<T>> myvec;
};
template <class T, template <class> class Policy>
struct Shell : public Policy<T> {
Shell() = default;
Shell(std::size_t N) : Policy<T>(N) {}
};
int main(int argc, char *argv[]) {
Shell<double, MyPolicy> s;
s = Shell<double, MyPolicy>(7);
Shell<double, MyPolicy> s2{6};
s = std::move(s2);
return 0;
}
以上一切正常。然而,要注意的是,由于 MyPolicy
应该是从中继承的,因此它的析构函数需要是 virtual
和 public
,或者非 virtual
和 protected
(至少,从书中引用)。
在上面的例子中,每当我取消注释行使它们成为
public:
virtual ~MyPolicy() = default;
或
protected:
~MyPolicy() = default;
代码无法编译。我不明白这个例子中与 std::unique_ptr
相关的问题是什么,因为类型 T
不是不完整的或者有 protected/private 析构函数的东西。
非常感谢你的帮助。谢谢。
声明析构函数可防止隐式声明移动构造函数和移动赋值运算符。因此,如果您声明一个虚拟析构函数并想要默认的特殊移动函数,您需要自己显式声明它们:
public:
virtual ~MyPolicy() = default;
MyPolicy(MyPolicy&&) = default; //here
MyPolicy& operator= (MyPolicy&&) = default; //and here
我正在研究 Modern C++ Design 的基于策略的设计,我被困在下面的一个简单示例中,我试图在我的 std::unique_ptr
中使用 std::vector
模板化策略 class:
#include <memory>
#include <vector>
template <class T> struct MyPolicy {
MyPolicy() = default;
MyPolicy(std::size_t N) : myvec{std::vector<std::unique_ptr<T>>(N)} {
for (std::size_t i = 0; i < N; i++)
myvec[i].reset(new T(i));
}
// protected: // or, even, public:
// /*virtual*/ ~MyPolicy() = default;
private:
std::vector<std::unique_ptr<T>> myvec;
};
template <class T, template <class> class Policy>
struct Shell : public Policy<T> {
Shell() = default;
Shell(std::size_t N) : Policy<T>(N) {}
};
int main(int argc, char *argv[]) {
Shell<double, MyPolicy> s;
s = Shell<double, MyPolicy>(7);
Shell<double, MyPolicy> s2{6};
s = std::move(s2);
return 0;
}
以上一切正常。然而,要注意的是,由于 MyPolicy
应该是从中继承的,因此它的析构函数需要是 virtual
和 public
,或者非 virtual
和 protected
(至少,从书中引用)。
在上面的例子中,每当我取消注释行使它们成为
public:
virtual ~MyPolicy() = default;
或
protected:
~MyPolicy() = default;
代码无法编译。我不明白这个例子中与 std::unique_ptr
相关的问题是什么,因为类型 T
不是不完整的或者有 protected/private 析构函数的东西。
非常感谢你的帮助。谢谢。
声明析构函数可防止隐式声明移动构造函数和移动赋值运算符。因此,如果您声明一个虚拟析构函数并想要默认的特殊移动函数,您需要自己显式声明它们:
public:
virtual ~MyPolicy() = default;
MyPolicy(MyPolicy&&) = default; //here
MyPolicy& operator= (MyPolicy&&) = default; //and here