向上投射并传递动态数组(C++)

Upcasting and passing a dynamic array(C++)

本文关键字:数组 动态 C++      更新时间:2023-10-16

我是一名学生,正在使用xcode编写旅游指南程序。我试图将Sport类型的对象Ds(我认为是这样)设置为Attraction类型。然后我想把新的Attraction对象传递给setAttraction()函数,但我得到了错误:

"无法将‘Attraction**’类型的参数初始化为‘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.nn";
    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的第一个目标,而不是整个数组。由于您将派生类的对象分配给基类,这将最终导致切片问题。什么是对象切片?

一个更好的方法是简单地将指针Ds传递给函数setAttraction(由于setAttraction的第一个参数是基类指针,所以它可以工作)。类似以下内容::

Dubai.setAttraction(Ds, x);

并且在基类Attraction中,将函数getName定义为虚函数,以便它可以用于任何类型的AttractionSportCultureShopping等)