上传和传递动态数组(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();
}
}
的问题是你的功能setAttraction
的setAttraction
宣言的声明是这样的:
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
被使用(Sport
,Culture
,Shopping
等)
那么,我已经完成了你写的东西,除了虚拟函数,因为它产生了另一个线程**线程1 exc_bad_access(code = 1 address = 0x0)**。然而,我仍然只是获得数组的第一个对象。 –
@MahmoudDawlatly你是否将'Ds'传递给'setAttraction()'?我不认为这是可能的,或者可能还有其他一些代码!你怎么知道你只得到第一个对象?你能显示完整的代码吗?大概复制/粘贴所有的代码和类到ideone.com或pastebin.com – user007
@MahmoudDawlatly我想知道继承是否存在一些问题,这是导致线程1 exc_bad_access(code = 1 address = 0x0)error – user007
请阅读如何创建一个最小化,完整和可验证的示例:http://stackoverflow.com/help/mcve – Ziezi
“体育”,“文化”,“购物”是否继承“吸引力”类? – user007
@simplicisveritatis对不起,但你能告诉我这个问题不是最小的,完整的或可验证的,特别是在你编辑它之后,我感谢你。代码太长,所以这是我可以做的最好的显示问题。我还强调了代码中问题的位置。 –