BucketSort::~BucketSort() {
for (int i = 0; i < DEFAULT_CAPACITY; ++i) {
if (a[i] != nullptr) {
a[i]->deleteBucket();
}
}
delete a;
a = nullptr;
}
Это мой код деструктора. Мой профессор говорит мне: «Вызывая функцию deleteBucket, вы удаляете узлы, но не объект». Тем не мение, Я не понимаю, что это значит, или, по крайней мере, я что-то упустил. Как я могу удалить объект, как она говорит?
Это в основном класс сортировки сегментов, который сортирует в соответствии с алгоритмом сортировки сегментов, изображенным здесь: https://www.geeksforgeeks.org/wp-content/uploads/scene01801.jpg
Все эти классы складываются, чтобы создать только это. Все функции работают нормально, за исключением того, что функция-член деструктора нуждается в некоторой подстройке.
Вот файл .cpp для Bucket Sort:
#include "bucketsort.h"
BucketSort::BucketSort() {
a = new Bucket*[DEFAULT_CAPACITY]();
numberOfElements = 0;
}
void BucketSort::print() const {
for (int i = 0; i < DEFAULT_CAPACITY; ++i) {
if (a[i] != nullptr) {
a[i]->print();
}
}
}
void BucketSort::insert(const vector <double>& v) {
int index;
int vectorSize = v.size(); // New addition to the codebase.
for (int i = 0; i < vectorSize; ++i) {
index = v[i] * 10;
if (a[index] == nullptr) {
Bucket* newBucket = new Bucket;
a[index] = newBucket;
}
a[index]->insert(v[i]);
++numberOfElements;
}
}
void BucketSort::createSortedList(Bucket& thisBucket) {
for (int i = 0; i < DEFAULT_CAPACITY; ++i) {
if (a[i] != nullptr && !a[i]->isEmpty()) {
thisBucket.moveAppend(*a[i]);
}
}
}
BucketSort::~BucketSort() {
for (int i = 0; i < DEFAULT_CAPACITY; ++i) {
if (a[i] != nullptr) {
a[i]->deleteBucket();
}
}
delete a;
a = nullptr;
}
Вот мой заголовок (и) для справки:
Bucketsort.h:
#ifndef BUCKETSORT_H
#define BUCKETSORT_H
#include "bucket.h"#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
const int DEFAULT_CAPACITY = 10;
class BucketSort
{
public:
// Constructors:
BucketSort();
// Functions:
void print() const;
void insert(const vector <double>& v);
void createSortedList(Bucket& a);
//
~BucketSort();
private:
Bucket** a;
int numberOfElements;
};
#endif
Bucket.h:
#ifndef BUCKET_H
#define BUCKET_H
#include <iostream>
using namespace std;
class Node
{
public:
Node() : item(0.0), link(nullptr) {}
Node(double newItem, Node *newLink) : item(newItem), link(newLink) {}
Node* getLink() const { return link; }
double getItem() const { return item; }
void setItem(double newItem) { item = newItem; }
void setLink(Node *newLink) { link = newLink; }
~Node() {}
private:
double item;
Node *link;
};class Bucket
{
public:
Bucket();
void insert(double value);
void moveAppend(Bucket& otherBucket);
void print() const;
bool isEmpty() const;
Bucket& operator=(Bucket&& otherBucket);
void deleteBucket();
~Bucket();
private:
Node * ptrToFirst;
Node *ptrToLast;
int numberOfElements;
};
#endif
SortedList.h:
#ifndef SORTEDLIST_H
#define SORTEDLIST_H
#include "bucketsort.h"#include <vector>
using namespace std;
class SortedList : public Bucket
{
public:
SortedList();
void sortList(const vector <double>& list);
~SortedList();
private:
};
#endif
Тестовый водитель:
#include "Bucket.h"
void runBucketTest() {
Bucket bucket1;
Bucket bucket2;
Bucket bucket3;
Bucket bucket4;
Bucket bucket5;
Bucket bucket6;
Bucket bucket7;
Bucket bucket8;
Bucket bucket9;
cout << "--------------------------------------------" << endl;
cout << "Bucket testing" << endl;
cout << "--------------------------------------------" << endl;
cout << "Bucket 1: ";
bucket1.insert(77);
bucket1.insert(42);
bucket1.insert(93);
bucket1.print();
bucket2.insert(91);
cout << endl << "Bucket 2: ";
bucket2.print();
bucket2.moveAppend(bucket1);
cout << endl << "Bucket 2 after moveAppend w/bucket 1 having existing elements: ";
bucket2.print();
bucket4.insert(69);
bucket4.insert(21);
bucket4.insert(979);
cout << endl << "Bucket 4: ";
bucket4.print();
cout << endl << "Bucket 3 after moveAppend w/bucket 4 having NO existing elements: ";
bucket3.moveAppend(bucket4);
bucket3.print();
cout << endl << "Bucket insertion into Bucket 5 and then deletion: " << endl;
bucket5.insert(101);
bucket5.insert(202);
bucket5.insert(303);
cout << "Before deletion: ";
bucket5.print();
cout << endl << "After deletion: ";
bucket5.deleteBucket();
bucket5.print();
cout << endl << "Bucket 6 = Bucket 7 assignment operator: " << endl;
bucket7.insert(10);
bucket7.insert(20);
bucket7.insert(5);
cout << "Buckets 6 before assignment operator: ";
bucket6.print();
cout << endl << "Bucket 7 before assignment operator: ";
bucket7.print();
cout << endl << "Bucket 6 after assignment operator (Bucket 6 = Bucket 7): ";
bucket6 = move(bucket7);
bucket6.print();
bucket8.insert(22);
bucket8.insert(21);
cout << endl << "Bucket 8 (already containing some elements) before assignment operator: ";
bucket8.print();
cout << endl << "Bucket 8 after assignment operator (Bucket 8 = Bucket 9): ";
bucket8 = move(bucket9);
bucket8.print();
}
Результат теста: https://i.imgur.com/zU7T2Su.png
Могу ли я получить помощь?
Так как вы создали экземпляр массива указателей Bucket
a = new Bucket*[DEFAULT_CAPACITY]();
Вам нужно будет удалить память, на которую ссылается каждый указатель:
delete a[i];
Что должно привести к:
BucketSort::~BucketSort() {
for (int i = 0; i < DEFAULT_CAPACITY; ++i) {
if (a[i] != nullptr) {
a[i]->deleteBucket();
delete a[i];
}
}
delete a;
a = nullptr;
}
Других решений пока нет …