保护不可默认构造的类的移动构造函数可以通过将移动构造函数声明为私有成员来实现。这样,只有类的友元或成员函数可以调用移动构造函数。
以下是一个示例代码:
class MyClass {
public:
MyClass(int value) : mData(value) {}
private:
MyClass(const MyClass& other) = delete; // 禁用复制构造函数
MyClass& operator=(const MyClass& other) = delete; // 禁用复制赋值运算符
MyClass(MyClass&& other) {} // 私有移动构造函数
MyClass& operator=(MyClass&& other) {} // 私有移动赋值运算符
int mData;
friend class FriendClass; // 声明友元类
};
class FriendClass {
public:
void MoveMyClass(MyClass&& obj) {
MyClass newObj(std::move(obj)); // 调用移动构造函数
// ...
}
};
int main() {
MyClass obj(10);
FriendClass friendObj;
friendObj.MoveMyClass(std::move(obj)); // 正确,友元类可以调用私有移动构造函数
// MyClass newObj(std::move(obj)); // 错误,无法调用私有移动构造函数
return 0;
}
在上面的示例中,MyClass
类的移动构造函数被声明为私有成员。只有类的友元类FriendClass
的成员函数MoveMyClass
可以调用该移动构造函数。其他地方则无法直接调用这个移动构造函数,从而保护了类的移动构造函数不被误用。
请注意,在示例中,我们还禁用了复制构造函数和复制赋值运算符,以确保只能通过移动语义来创建和赋值MyClass
对象。
上一篇:保护Bookdown文档的密码