向上转换和传递动态数组(C++)

Upcasting and passing a dynamic array(C++)

我是一名学生,正在使用 xcode 从事旅游指南项目。我正在尝试将 Sport 类型的对象 Ds 设置为 Attraction 类型,这是一个动态数组(我认为是)。然后我想将新的 Attraction 对象传递给 setAttraction() 函数,但我得到错误:

"cannot initialize a parameter of type 'Attraction**' to a lvalue of type 'Attraction*'.

现在我是 OOP 和 C++ 的新手,所以我不知道那是什么意思。

main.cpp:

int main() {
    int x;
    City Rome(111,"Rome");
    City Dubai(222,"Dubai");
    City Paris(333, "Paris");

    cin >> x;

    Sport* Ds = new Sport[x];
    Culture* Dc = new Culture[x];
    Shopping* Dh = new Shopping[x];

    //{ new Sport, new Sport, new Sport, new Culture, 
    //  new Culture, new Culture, new Shopping, new Shopping, new Shopping};

    Ds[0].setName("Camel and Horse Racing");
    Ds[1].setName("Marine Sports");
    Ds[2].setName("Football");
    Dc[0].setName("Dubai Museum");
    Dc[1].setName("Falconry");
    Dc[2].setName("Sheikh Saeed Al-Maktoum's House");
    Dh[0].setName("Dubai Mall");
    Dh[1].setName("Mall of Emirates");
    Dh[2].setName("Deira City Centre");
    Ds[0].setIDType(1);
    Ds[1].setIDType(1);
    Ds[2].setIDType(1);
    Dc[0].setIDType(2);
    Dc[1].setIDType(2);
    Dc[2].setIDType(2);
    Dh[0].setIDType(3);
    Dh[1].setIDType(3);
    Dh[2].setIDType(3);

    //Here's the problem
    Attraction* z = new Attraction[x];
    *z = *Ds;

    Dubai.setAttraction(z, x);
    menu(Rome,Dubai,Paris);

    return 0;
}

'City.cpp':

#include "City.h"
#include "Sport.h"
#include "Culture.h"
#include "Shopping.h"
#include <iostream>
#include "Attraction.h"
using namespace::std;

string City::getName(){
    return name;
}

int City::getID(){
    return id;
}

void City::setAttraction(Attraction a[], int size){
    attractions = new Attraction[size];
    for (int i = 0; i < size ; i++) {
        attractions[i].setName(a[i].getName());//Here's the thread
        cout << attractions[i].getName() << endl;
    }
    for (int j = 0; j < size ; j++) {
        attractions[j].setIDType(a[j].getIDType());
    }
}

void City::displayAttraction(){
    cout << "There you go.\n\n";
    for (int i = 0; i < 9 ; i++) {
        cout << attractions[i].getName();
    }
}

问题是你的函数声明 setAttraction setAttraction 的声明是这样的 ::

void setAttraction(Attraction* a[], int size)

因为你已经定义了 Attraction *a[] 这意味着 a 是一个双指针,这就是你得到错误的原因,因为你将一个指针参数传递给函数 z当你打电话的时候。因此,您要么将声明更改为类似这样的内容 ::

void setAttraction(Attraction* a, int size);

 void setAttraction(Attraction a[], int size);

我认为这应该可以解决它。

此外,在你的代码中你这样做了::

Attraction* z = new Attraction[x];
*z = *Ds;

我认为您正在尝试创建一个 Attraction 数组,然后将 Sport 数组复制到 z。但是,实际上您只是将数组 Ds 中的第一个对象复制到 z 的第一个对象,而不是整个数组。由于您将派生 class 的对象分配给基 class,这最终会导致切片问题。 What is object slicing?

更好的方法是简单地将指针 Ds 传递给函数 setAttraction(因为 setAttraction 的第一个参数是基础 class 指针,所以它将工作)。 像这样的东西::

Dubai.setAttraction(Ds, x);

并且在基础 class Attraction 中将函数 getName 定义为虚函数,这样它就可以用于任何类型的 Attraction (Sport, Culture, Shopping, 等)