使用友元函数重载新运算符
Overloading new operator using friend function
我已经重载了 'new' 运算符作为我的 class 数组的成员函数。我需要帮助将其重载为友元函数。请参阅下面的程序:
#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;
}
我在友元函数中尝试做的事情:
void * operator new (size_t size) throw (std::bad_alloc)
{
void * ptr = ::new Array;
return ptr;
}
我为此陷入了无限循环。有人可以帮我吗?
编辑:语法
只能有一个::operator new(size_t)
。通常标准库会提供一个。如果您提供一个,它将 替换 (不会超载)标准库提供的那个。
您的版本无条件地调用自身(没有其他 ::operator new(size_t)
),因此存在无限递归和堆栈溢出。
您无法提供 ::operator new(size_t)
,希望它能与系统提供的 ::operator new(size_t)
一起使用,但仅适用于您的 class。
使全局重载的唯一方法 operator new
是给它一个不同的签名,例如
enum foo {bar};
void* operator new (std::size_t size, foo) { ... }
...
Array* arr = new (bar) Array;
但是您可以使用它来分配任何类型,而不仅仅是 Array
,无论哪个 classes 决定与它成为朋友。
所以只需添加上面的答案,您就可以按照以下方式重载您的 operator new 和 delete,这将起作用,因为内部构造函数将调用 operator new[] 而不是 operator new.Also 不需要交这个朋友,因为您没有在此函数中访问任何私有数据成员:
#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;
}
我已经重载了 'new' 运算符作为我的 class 数组的成员函数。我需要帮助将其重载为友元函数。请参阅下面的程序:
#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;
}
我在友元函数中尝试做的事情:
void * operator new (size_t size) throw (std::bad_alloc)
{
void * ptr = ::new Array;
return ptr;
}
我为此陷入了无限循环。有人可以帮我吗?
编辑:语法
只能有一个::operator new(size_t)
。通常标准库会提供一个。如果您提供一个,它将 替换 (不会超载)标准库提供的那个。
您的版本无条件地调用自身(没有其他 ::operator new(size_t)
),因此存在无限递归和堆栈溢出。
您无法提供 ::operator new(size_t)
,希望它能与系统提供的 ::operator new(size_t)
一起使用,但仅适用于您的 class。
使全局重载的唯一方法 operator new
是给它一个不同的签名,例如
enum foo {bar};
void* operator new (std::size_t size, foo) { ... }
...
Array* arr = new (bar) Array;
但是您可以使用它来分配任何类型,而不仅仅是 Array
,无论哪个 classes 决定与它成为朋友。
所以只需添加上面的答案,您就可以按照以下方式重载您的 operator new 和 delete,这将起作用,因为内部构造函数将调用 operator new[] 而不是 operator new.Also 不需要交这个朋友,因为您没有在此函数中访问任何私有数据成员:
#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;
}