C++ 使用friend函数重载新运算符
我重载了'new'运算符作为类数组的成员函数。我需要帮助重载它作为朋友函数。请参阅下面的程序:C++ 使用friend函数重载新运算符,c++,operator-overloading,new-operator,C++,Operator Overloading,New Operator,我重载了'new'运算符作为类数组的成员函数。我需要帮助重载它作为朋友函数。请参阅下面的程序: #include<iostream> using namespace std; class Array { private: int *arr; int size; public: void * operator new (size_t size) { void *ptr = ::new Array; r
#include<iostream>
using namespace std;
class Array {
private:
int *arr;
int size;
public:
void * operator new (size_t size)
{
void *ptr = ::new Array;
return ptr;
}
void operator delete(void *ptr)
{
::delete ptr;
}
Array(int n=5)
{
this->size = n;
this->arr = new int[n];
}
void input()
{
cout<<"Enter the values"<<endl;
for(int i=0; i<size; i++)
cin>>arr[i];
}
void show()
{
for(int i=0; i<size; i++)
cout<<arr[i]<<" ";
cout<<endl;
}
};
int main()
{
Array *A = new Array(4);
A->input();
A->show();
return 0;
}
我得到了一个无限循环。有人能帮我吗
编辑:语法只能有一个
::运算符新建(大小)
。通常,标准库提供一个。如果您提供了一个,它将替换(不会重载)标准库提供的一个
您的版本无条件地调用自身(没有其他::operator new(size\u t)
),因此其中有一个无限递归和堆栈溢出
您不能提供::operator new(size\u t)
并希望它能与提供的系统一起工作::operator new(size\u t)
,但只能为您的班级提供
使全局重载的运算符成为新的运算符的唯一方法是给它一个不同的签名,例如
enum foo {bar};
void* operator new (std::size_t size, foo) { ... }
...
Array* arr = new (bar) Array;
但您可以使用它来分配任何类型,而不仅仅是数组
,无论哪个类决定与它交朋友。因此,只需添加上面的答案,您就可以重载运算符new并按以下方式删除,这将起作用,因为构造函数中的一个将调用运算符new[]非新操作员。也无需交此朋友,因为您在此函数中未访问任何私人数据成员:
void * operator new (size_t size) throw (std::bad_alloc)
{
void * ptr = ::new Array;
return ptr;
}
#include <iostream>
#include <string>
using namespace std;
class Array {
private:
int *arr;
int size;
public:
Array(int n=5)
{
this->size = n;
this->arr = new int[n];
}
void input()
{
cout<<"Enter the values"<<endl;
for(int i=0; i<size; i++)
cin>>arr[i];
}
void show()
{
for(int i=0; i<size; i++)
cout<<arr[i]<<" ";
cout<<endl;
}
};
void * operator new (size_t size)
{
void *ptr = std::malloc(size);
return ptr;
}
void operator delete(void *ptr)
{
std::free(ptr);
}
int main()
{
Array *A = new Array(4);
A->input();
A->show();
return 0;
}
#包括
#包括
使用名称空间std;
类数组{
私人:
int*arr;
整数大小;
公众:
数组(int n=5)
{
这个->大小=n;
此->arr=新整数[n];
}
无效输入()
{
coutt你的程序没有任何问题(只要你保留'new'重载)…好吧,一些小细节,但它应该编译/运行。你到底为什么要这样重载'new'。这个友元函数应该在哪里?编译器错误是什么?你有没有排除“无限循环”的问题?如果是,那么如何处理?至于您声称的“friend”函数的代码……请注意,新运算符在所有控制路径上都是自然递归的,并且您使用它的方式应该会导致运行时堆栈溢出,尽管可能编译为OK。这是一个坏主意。