交换指针数组(指向类的指针)元素

时间:2018-10-29 15:31:48

标签: c++ pointers data-structures

我创建了一个指针数组,该数组表示名为Sinif的Class对象。 Sinfi *sinif = new Sinif[5]我们知道每个元素都有一个地址。例如,在我的家庭作业中,我想将sinif的第一个元素与第二个元素及其adre交换。在Degistir函数中它会更改,但是只有最后写入的命令运行良好。假设我们要用1更改Sinif 0,将0更改为1,但1保持不变。这是详细示例的照片。

Before Swapping After Swapping

在这里,第一个用户输入要移动的元素,而不是要移动的位置,并且程序在找到每个Sinif数组时会在其中寻找它。然后,将adreses收集到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 :(得分:1)

Sinfi *sinif = new Sinif[5]在内存中创建5个Sinif实例的数组。不是指针,而是实际实例。

所以当您稍后说:

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

您要做的是将sinif的内容从一个复制到另一个。现在两者都一样了。所以下一行

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

什么都不做。 *temp已被*temp2覆盖,您只需将其复制回来。

答案 1 :(得分:0)

我使用了swap();函数,该函数在注释中建议使用,而不是试图获取每个元素的地址,我还添加了名为degisti的bool变量,以防止其恢复原状。


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
}