Удаление записи из массива указателей моего собственного типа класса

0

Я создал класс Employee:

class Employee {

private:

    int idNumber;
    string name, department, position;

public:
    Employee() {
        idNumber = 0;
        name = department = position = "";
    }

    Employee(string n, int idn) {
        name = n;
        idNumber = idn;

        department = position = "";
    }

    Employee(string n, int idn, string dep, string pos) {
        name = n;
        idNumber = idn;
        department = dep;
        position = pos;
    }

    void setName(string n) {
        name = n;
    }

    void setidNumber(int idn) {
        idNumber = idn;
    }

    void setDepartment(string dep) {
        department = dep;
    }

    void setPosition(string pos) {
        position = pos;
    }

    string getName() {
        return name;
    }

    int getidNumber() {
        return idNumber;
    }

    string getDepartment() {
        return department;
    }

    string getPosition() {
        return position;
    }

};

Теперь я создал 2D-массив указателей типа Employee:

int n=2;
Employee **p = new Employee * [n];

for (int i=0; i < n; i++)
    p[i] = new Employee;

Я сохранил две записи успешно:

Name    ID Number    Department    Position
FS      30           CS            BS
AT      27           CS            BS

У меня есть этот код, чтобы удалить запись Employees:

    string del_name;
    int flag = 0;

    cin.ignore();
    cout << "Enter name: ";
    getline(cin, del_name);

    for (int i=0; i < n; i++) {

        while (del_name == p[i]->getName() && i < n) {
            if (del_name == p[i]->getName()) {
                delete p[i];
                p[i] = NULL;
                --k;
                ++flag;
                cout << "Record deleted." << endl;
                break;
            }
            else
            {
                flag = 0;
            }

        }
    }

    if (flag == 0)
        cout << "No record found having name " << del_name << "." << endl;

Теперь, Какая проблема:

  1. Если запись найдена несколько раз. Он успешно удаляется, даже если все записи удаляются.

    • Но если ВСЕ записи уникальны, и я удаляю записи один за другим, и все записи удаляются таким образом, тогда программа заканчивается.
  2. Кроме того, существует ли какой-либо другой оптимизированный подход для удаления записей без использования VECTORS.

Надеюсь, я четко объяснил свою проблему. При необходимости я могу предоставить дополнительную информацию.

Спасибо за ваше время

  • 0
    Почему вы против vector (и, по-видимому, других std:: container)? У вас есть то же самое возражение против умных указателей ?
  • 0
    @Johnsyweb: нет, я не против vector или других вещей. Просто я еще не научился этим вещам.
Показать ещё 6 комментариев
Теги:
arrays
pointers

1 ответ

0

Во-первых, использование std :: vector <> или какого-либо другого объекта-контейнера - это способ этого. Если вы можете написать код, который бьет (с точки зрения скорости), написанный профессиональными библиотечными писателями, тогда идите вперед.

Во-вторых, какова ваша цель? Если он просто освобождает записи в этом массиве в зависимости от некоторых критериев, цикл, который вы написали, слишком сложный.

bool recordDeleted = false;
for (int i=0; i < n; ++i) 
{
    if (del_name == p[i]->getName()) 
    {
        delete p[i];
        p[i] = NULL;
        recordDeleted = true;
    }
}

if ( !recordDeleted )
{
   // record not found
}
  • 0
    Да, я знаю, что это сложно, но я не понимаю причину своей проблемы, которую я объяснил выше.
  • 0
    1) Какова цель этого while ()? while (del_name == p[i]->getName() && i < n) 2) Почему в условии цикла while () вы проверяете i <n? Условие цикла for () уже ограничивает значение i меньше n. 3) Почему вы делаете один и тот же тест дважды в цикле while? { if (del_name == p[i]->getName()) {
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню