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

问题描述:

我是一名正在使用xcode开发旅游指南程序的学生。我试图设置Sport类型的对象Ds这是一个动态数组(我认为是),其类型为Attraction。然后我想新Attraction对象传递给setAttraction()功能,但我得到的错误:上传和传递动态数组(C++)

"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(); 
    } 
} 
+0

请阅读如何创建一个最小化,完整和可验证的示例:http://stackoverflow.com/help/mcve – Ziezi

+0

“体育”,“文化”,“购物”是否继承“吸引力”类? – user007

+0

@simplicisveritatis对不起,但你能告诉我这个问题不是最小的,完整的或可验证的,特别是在你编辑它之后,我感谢你。代码太长,所以这是我可以做的最好的显示问题。我还强调了代码中问题的位置。 –

的问题是你的功能setAttractionsetAttraction宣言的声明是这样的:

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

既然你已经定义了Attraction *a[]它的意思s 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作为虚拟的,以便它可以在任何类型的Attraction被使用(SportCultureShopping等)

+0

那么,我已经完成了你写的东西,除了虚拟函数,因为它产生了另一个线程**线程1 exc_bad_access(code = 1 address = 0x0)**。然而,我仍然只是获得数组的第一个对象。 –

+0

@MahmoudDawlatly你是否将'Ds'传递给'setAttraction()'?我不认为这是可能的,或者可能还有其他一些代码!你怎么知道你只得到第一个对象?你能显示完整的代码吗?大概复制/粘贴所有的代码和类到ideone.com或pastebin.com – user007

+0

@MahmoudDawlatly我想知道继承是否存在一些问题,这是导致线程1 exc_bad_access(code = 1 address = 0x0)error – user007