自己编写 C++“数组”类

Abd*_*een -5 c++ compiler-errors class object

我自己正在编写 C++ 整数数组类和一个用于提取子数组的函数,但是在尝试编译我的代码时出现此错误:

“这一行有多个标记 - 没有返回,在函数中返回非空 - 带有 'Array Array::subArr(int, int)'”

(抱歉忘记包含此错误)

- ‘int* Array::subArr(int, int)’ cannot be overloaded
Run Code Online (Sandbox Code Playgroud)

但是为什么不能超载呢?

Array 类的私有数据成员是:

private:
    int *arr;
    int *subArray;
    int *subArr1;
    int len;
Run Code Online (Sandbox Code Playgroud)

导致错误的两个公共函数是:

int * subArr(int pos, int siz)
{
    if (pos+siz < len)
    {
        subArr1 = new int[siz];
        for (int i=0; i<siz; i++)
        {
            subArr1[i] = arr[pos];
            pos++;
        }
        return subArr1;
    }
}
Run Code Online (Sandbox Code Playgroud)

Array subArr(int pos, int siz)
{
    if (arr != NULL && (siz + pos) < len)
    {
        Array sub;
        sub.len = siz;
        sub.subArray = new int [siz];
        for (int i=0; i<siz; i++)
        {
            sub.subArray[i] = arr[pos];
            pos++;
        }
        return sub;
    }
    cout<<"Error. Enter a valid index and/or position\n";
}
Run Code Online (Sandbox Code Playgroud)

如果需要,我可以发送整个课程代码。

Dev*_*lar 5

这就是它所说的;

没有返回,在返回非空的函数中 - 使用 'Array Array::subArr(int, int)'"

看代码:

int * subArr(int pos, int siz)
{
    if (pos+siz < len)
    {
        subArr1 = new int[siz];
        for (int i=0; i<siz; i++)
        {
            subArr1[i] = arr[pos];
            pos++;
        }
        return subArr1;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果if (pos+siz < len)是假的怎么办?

正确,在声明为 return 的函数中,您没有任何要返回的内容int *。那是一个错误。


'int* Array::subArr(int, int)' 不能重载

看代码:

int * subArr(int pos, int siz)
Array subArr(int pos, int siz)
Run Code Online (Sandbox Code Playgroud)

这两个函数仅在返回类型上有所不同。这是不可能的; 参数的数量和/或类型必须有所不同。


无偿的一般建议:

  • 避免重新实现标准功能,而不是作为练习。
  • 避免使用指针。
  • 避免,new除非...

    • 在构造函数中,您的析构函数具有相应的delete.
    • 包裹在智能指针分配中。

    (在函数内部分配内存,然后期望调用者再次释放它是内存泄漏的主要来源。)

  • 不要向 写入错误cout,抛出异常。
  • 使用 nullptr,而不是 NULL。

简而言之,编写 C++,而不是带有类的 C —— 那是三十年前的事了。