gpt4 book ai didi

c++ - 使用友元函数重载新运算符

转载 作者:行者123 更新时间:2023-11-30 03:31:37 24 4
gpt4 key购买 nike

我已将“new”运算符重载为我的类 Array 的成员函数。我需要帮助将其重载为友元函数。请参阅下面的程序:

#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,无论哪个类决定与它成为 friend 。

关于c++ - 使用友元函数重载新运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44098213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com