【发布时间】:2018-08-08 12:30:19
【问题描述】:
我试图通过将删除运算符重载为友元函数来实现这一点。代码如下:
#include <iostream>
class HeapOnly
{
int x;
int y;
~HeapOnly()
{
}
public:
void friend operator delete(void* a);
};
void operator delete(void* p)
{
delete p;
}
int main()
{
HeapOnly *abc = new HeapOnly();
delete abc;
}
以上代码在 Visual Studio 中给出错误“Error C2248 'HeapOnly::~HeapOnly': cannot access private member declaration in class 'HeapOnly”
我不明白为什么它会出错,因为删除运算符作为友元函数重载,因此它应该能够访问私有的析构函数。
【问题讨论】:
-
为什么不希望这种类型的对象具有任何其他存储持续时间?
-
您是否考虑过私有构造函数,使用返回指针的静态方法获取新实例?另外,你究竟为什么需要这样的课程?
-
“我正在尝试定义一个只能在堆上实例化的类” - 我不明白为什么,但是如何将所有构造函数设为私有并提供在堆上创建实例的工厂静态成员函数?
-
delete不是运算符,与重载实际运算符时不同,delete abc不是调用operator delete的语法糖。operator delete有一个令人困惑的名称,更适合称为“deallocate”或“free”或类似的名称,但“C++ 方式”是重载现有保留字的含义,而不是引入新保留字。
标签: c++ visual-studio