Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用friend函数重载新运算符_C++_Operator Overloading_New Operator - Fatal编程技术网

C++ 使用friend函数重载新运算符

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

我重载了'new'运算符作为类数组的成员函数。我需要帮助重载它作为朋友函数。请参阅下面的程序:

#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。这是一个坏主意。