Замена элементов массива указателей (указатель на класс) - PullRequest
0 голосов
/ 29 октября 2018

Я создал массив указателей, который представляет объекты класса с именем Sinif. Sinfi *sinif = new Sinif[5] Как мы знаем, у каждого элемента есть адрес. В моем домашнем задании, например, я хочу поменять первый элемент sinif со вторым элементом с его адресами. Функция Degistir меняется, но работает только последний написанный. Допустим, мы хотим изменить Sinif 0 с 1, он изменит 0 на 1, но 1 останется без изменений. Вот фотографии для подробного примера.

Before Swapping After Swapping

здесь, Первый пользователь вводит, какой элемент перемещать, чем куда перемещать, и программа ищет его в каждом массиве Sinif, когда находит его. Адреса собираются в temp и temp2, после чего он назначает его.

Sinif *temp; 
Sinif *temp2;

   void Yonetim::SinifDegistir() {
    char DegisecekSinif;
    char YeniYeri;
    cout << "Degisecek Sinif Adi: "; cin >> DegisecekSinif;
    cout << "Yeni Sinif Yerinin Adi: "; cin >> YeniYeri;
    for (int i = 0; i < okul->SayacGet(); i++)
    {
        if (DegisecekSinif == okul->sinif[i].sinif) {
            temp = okul->sinif + i;
            for (int j = 0; j < okul->SayacGet(); j++)
            {
                if (YeniYeri == okul->sinif[j].sinif) {
                    temp2 = okul->sinif + j;
                    Degis(i, j);
                }
            }
        }
    }
}
void Yonetim::Degis(int i, int j) {

    (okul->sinif[i]) = *temp2;
    (okul->sinif[j]) = *temp;
    TabloYazdirma();
}

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Я использовал функцию swap();, которая была рекомендована в комментариях, вместо того, чтобы пытаться получить адрес каждого элемента. Также я добавил переменную bool, названную degisti, чтобы запретить возврат к тому, что было


void Yonetim::SinifDegistir() {
    char DegisecekSinif;
    char YeniYeri;
    bool degisti = false;
    cout << "Degisecek Sinif Adi: "; cin >> DegisecekSinif;
    cout << "Yeni Sinif Yerinin Adi: "; cin >> YeniYeri;
    for (int i = 0; i < okul->SayacGet(); i++)
    {
        if (DegisecekSinif == okul->sinif[i].sinif && !degisti) {
            temp = okul->sinif + i;
            for (int j = 0; j < okul->SayacGet(); j++)
            {
                if (YeniYeri == okul->sinif[j].sinif) {
                    temp2 = okul->sinif + j;
                    Degis(i, j,degisti);
                }
            }
        }
    }
}
void Yonetim::Degis(int i, int j, bool &degisti) {
    swap(okul->sinif[i], okul->sinif[j]); //changes 
    TabloYazdirma();
    degisti = true; //bool says it was swapped
}
0 голосов
/ 29 октября 2018

Sinfi *sinif = new Sinif[5] создает массив из 5 экземпляров Sinif в памяти. Не указатели, а фактические экземпляры.

Итак, когда вы позже скажете:

(okul->sinif[i]) = *temp2;

То, что вы делаете, это копирование содержимого sinif из одного в другое. Теперь оба одинаковы. Итак, следующая строка

(okul->sinif[j]) = *temp;

ничего не делает. *temp уже перезаписан *temp2, и вы просто копируете его обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...