【问题标题】:Swapping Pointer Array (Pointer to Class) Elements交换指针数组(指向类的指针)元素
【发布时间】:2018-10-29 15:31:48
【问题描述】:

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

在这里,第一个用户输入要移动的元素而不是移动的位置,程序在找到它时在每个Sinif Array中查找它然后将地址收集到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();
}

【问题讨论】:

  • temptemp2 是什么?这里应该使用哪个函数进行交换(我假设 Degis,但它看起来不像是正确的交换)?
  • 如果你想交换一个数组的两个元素,你不交换元素的地址,你交换元素本身。你可以使用std::swap 函数来实现。
  • Sinfi *sinif = new Sinif[5] 不是指针数组。
  • @JohnnyMopp 哦,但是它将对象保存在堆中,对吗?我只是想使用数组在堆中创建指向类的指针
  • @Someprogrammerdude 是的,它成功了,非常感谢!!!

标签: c++ pointers data-structures


【解决方案1】:

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

所以当你稍后说:

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

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

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

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

【讨论】:

    【解决方案2】:

    我使用了 cmets 中推荐的 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
    }
    

    【讨论】: