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

时间:2015-12-20 13:31:27

标签: c++ pointers xcode6 dynamic-arrays

我是一名正在使用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();
    }
}

1 个答案:

答案 0 :(得分:2)

问题是你声明函数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定义为虚拟,以便它可以用于任何类型的AttractionSport,{{1} },Culture等)