【问题标题】:OOP C++ language面向对象 C++ 语言
【发布时间】:2022-02-21 01:34:06
【问题描述】:

我开始学习 C++ 中的 OOP。我尝试解决这样的任务:

创建一个类——一个基于千篇一律的整数数组的列表。分配构造函数、析构函数、将元素添加到列表顶部(末尾)、按编号从列表中选择元素、对列表进行排序、将列表元素显示到顶部和底部的功能列表。”

在delete函数中,编译器不断敲出同样的错误:

E0852 表达式必须是指向对象 My_4_Project C:\Users\artem\source\repos\Project4\My_4_Project\Source.cpp 的完整类型的指针

这是我的代码:

#include <iostream>
#include <algorithm>

using namespace std;

class Array {
  private:
    int* a;
    unsigned int size;
    int b, c = 0, d;
  public:
    Array();
    Array(int s);
    ~Array();
    int& operator[](int index);
    void setarray();
    void getarray();
    void add();
    void delet();
    void sort();
};

Array::Array() {
   size = 10;
   a = new int[size];
   for (size_t i = 0; i != size; i++) {
         a[i] = 0;
   }
}
Array::Array(int s) {
   if (s > 0) {
       size = s;
       a = new int[size];
       for (size_t i = 0; i != size; i++) {
           a[i] = 0;
       }
   }
   else cout << "Size can't be negativ";
}
Array::~Array() {
   delete[]a;
}
int& Array::operator[](int index) {
    if (index <= size) {
        return a[index];
    }
}
void Array::setarray() {
    for (size_t i = 0; i != size; i++) {
          cin >> a[i];
    }
}
void Array::getarray() {
    for (size_t i = 0; i != size; i++) {
        cout << a[i] << " ";
    }
}
void Array::add()
{
     /* ? ? ? */ ;
}
void Array::delet() {
    cin >> b;
    for (int i = 0; i < size; i++)
    {
        if (b == a[i])
            c++;
        if (c > 2) delete a[i];
    }
    cout << c;
}
void Array::sort() {
    int temp;

    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if (a[j] > a[j + 1]) {
               temp = a[j];
               a[j] = a[j + 1];
               a[j + 1] = temp;
            }
        }
    }
    for (int i = 0; i < size; i++) {
        cout << a[i] << " ";
    }
}

int main() {
    cout << "Enter 10 number`s massive: ";
    Array arr(10);
    arr.setarray();
    cout << endl;
    arr.getarray();
    cout << endl;
    cout << "Sorted massive: ";
    arr.sort();
    cout << endl;
    cout << "Witch symbol you wanna delete?: ";
    arr.delet();
    return 0;
}

【问题讨论】:

  • 您正在尝试删除a[i],它的类型为int。这是不可能的,因为错误正确地指出,您只能删除指针。遗憾的是,从您有限的描述来看,我无法完全理解您想要在那里实现的目标,所以我真的无法提供进一步的帮助。
  • 您不能从数组中删除元素。您可以将索引上方的所有元素向左移动一位并减小大小,但在这种情况下,您可能希望数组具有sizecapacity,其中size 是活动元素的数量,容量为分配的元素数量。

标签: c++ arrays oop delete-operator


【解决方案1】:

问题是delete 不像你想的那样工作:

  • 您可以 delete 一个您之前使用 new 创建的对象(new 返回一个指针,而 delete 则期望相同的指针)。
  • 您可以delete[] 之前使用new[] 创建的东西
  • 但不能混合:当单个元素是使用new[] 创建的数组的一部分时,您不能delete

我不会为你做这个练习,但诀窍是:

  1. 找到要删除的重复元素的索引,
  2. 之后将每个元素复制到之前的一个索引(即a[j]=a[j+1],当然要确保j+1&lt;size
  3. 将大小减一。

比如:

void Array::delet() {
     cin >> b;       // better put this in main() and pass it as argument
     for (int i = 0; i < size; i++)
     {
        if (b == a[i]) 
        {            // it'll be more than a single statement
            c++;
            if (c > 2) // found a duplicate 
            {         // NO delete a[i];
                ... // insert a loop to copy the next ones
                    // and reduce the size 
                ...  // EXTRA CAUTION:  in this case the next element 
                     // is again at offset i and not i++
            }
         }
     }
     cout << c;     // ok,  you can display the number of occurences counted
}

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 2011-08-01
    • 2010-09-06
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多