2015-12-20 5 views
0

Я студент, который работает над программой туристического гида, используя xcode. Я пытаюсь установить объект Ds типа Sport, который является динамическим массивом (я думаю, так), чтобы быть типа Attraction. Затем я хочу передать новый объект Attraction функции setAttraction(), но я получаю ошибку:Ускорение и передача динамического массива (C++)

"cannot initialize a parameter of type 'Attraction**' to a lvalue of type 'Attraction*'.

Теперь я новичок в ООП и 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

Do 'Sports',' Culture', 'Shopping' наследуют класс' Attraction'? – user007

+0

@simplicisveritatis Извините, но можете ли вы рассказать мне, как вопрос не минимальный, полный или проверяемый, особенно после того, как вы его отредактировали, и я благодарю вас за это. Код слишком длинный, так что это лучшее, что я могу сделать, чтобы показать проблему. Я также выделил расположение проблем в коде. –

ответ

2

Проблема ваша декларация функции 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, а не весь массив. Поскольку вы назначаете объекты производного класса базовому классу, это в конечном итоге приведет к проблеме Slicing. What is object slicing?

Лучше было бы просто передавая указатель Ds функции setAttraction (Так как первый параметр setAttraction является указателем базового класса, поэтому он будет работать). Нечто подобное ::

Dubai.setAttraction(Ds, x); 

И в базовом классе Attraction определения функции getName как виртуальные, так что он может быть использован на любом типе Attraction (Sport, Culture, Shopping и т.д.)

+0

Ну, я сделал то, что вы написали, кроме виртуальной функции, поскольку он создал другой поток ** thread 1 exc_bad_access (code = 1 address = 0x0) **. Тем не менее, я все еще получаю первый объект массива. –

+0

@MahmoudDawlatly Вы передаете 'Ds' в' setAttraction() '?? Я не думаю, что это возможно, или, возможно, есть какой-то другой код! И откуда вы знаете, что вы получаете только первый объект? Вы можете показать полный код? Вероятно, скопируйте/вставьте весь код и классы в ideone.com или pastebin.com. – user007

+0

@MahmoudDawlatly Интересно, есть ли какая-то проблема в наследовании, которая приводит к ошибке 'thread 1 exc_bad_access (code = 1 address = 0x0)' – user007