我是一个正在使用xcode开发旅游指南程序的学生。我正在尝试将类型为Ds的对象Sport设置为类型为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.\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的第一个对象,而不是整个数组。由于将派生类的对象分配给基类,因此最终将导致切片问题。 What is object slicing?

更好的方法是将指针Ds传递给函数setAttraction(由于setAttraction的第一个参数是基类指针,因此它将起作用)。
像这样的东西::

Dubai.setAttraction(Ds, x);


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

09-30 14:50