向上投射并传递动态数组(C++)
Upcasting and passing a dynamic array(C++)
我是一名学生,正在使用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
定义为虚函数,以便它可以用于任何类型的Attraction
(Sport
、Culture
、Shopping
等)
相关文章:
- std::向量与传递值的动态数组
- 将数组动态分配到具有指针参数的函数中
- 我可以以某种方式使我的矢量/数组动态更改装置数量吗?
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 为什么C 没有方便的方式来为多维数组动态分配内存
- 如何制作具有动态大小的数组?动态数组的一般用法(可能还有指针)
- c++中的数组动态内存分配
- 多维数组动态分配的内存图
- 如何在 c++ 中使用 2-D 固定数组为 4-D 数组动态分配内存
- C++ 我在数组/动态内存方面遇到了一些问题
- C++ 中从数组动态强制转换
- C++中高维数组动态内存分配的正确方法.
- 从 C++ 结构中包含的指针数组动态分配和访问内存
- 对象数组动态内存分配
- 为二维数组动态分配内存时出错
- 如何将2d数组动态分配给结构
- 为结构数组c++动态分配内存
- 将数组动态添加到多维数组
- 类中的类数组-动态数组(c++)有问题
- 分配对象数组动态冻结