2015-12-20 1 views
0

Je suis un étudiant qui travaille sur un programme de guide touristique en utilisant xcode. J'essaie de définir l'objet Ds de type Sport qui est un tableau dynamique (je pense) d'être de type Attraction. Ensuite, je veux passer le nouvel objet Attraction à la fonction setAttraction(), mais je reçois l'erreur:Atteindre et passer un tableau dynamique (C++)

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

Maintenant, je suis nouveau à POO et C++, donc je ne sais pas ce que cela signifie.

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

S'il vous plaît lisez comment créer un exemple minimal, complet et vérifiable: http: //stackoverflow.com/help/mcve – Ziezi

+0

Est-ce que 'Sports',' Culture', 'Shopping' hérite de la classe' Attraction'? – user007

+0

@simplicisveritatis Je suis désolé, mais pouvez-vous me dire si la question n'est pas minimale, complète ou vérifiable, surtout après l'avoir édité, ce dont je vous remercie. Le code est trop long, donc c'est le meilleur que je puisse faire pour montrer le problème. J'ai également mis en évidence l'emplacement des problèmes dans le code. –

Répondre

2

Le problème est votre déclaration de la fonction setAttraction la déclaration du setAttraction est comme celui-ci ::

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

Depuis que vous avez défini Attraction *a[] cela signifie s a est un double pointeur, c'est pourquoi vous obtenez l'erreur, puisque vous passez un seul argument de pointeur à la fonction z lorsque vous l'appelez. Donc, soit vous changez la déclaration à quelque chose comme ceci ::

void setAttraction(Attraction* a, int size); 

ou

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

Je pense que cela devrait le résoudre.

De plus dans votre code que vous faites cela ::

Attraction* z = new Attraction[x]; 
*z = *Ds; 

Je pense que vous essayez de créer un tableau de Attraction puis copiez le tableau Sport à z. Mais, en effet, vous copiez simplement le premier objet dans le tableau Ds au premier objet de z, et non le tableau entier. Puisque vous assignez les objets de la classe dérivée à la classe de base, cela finira par entraîner un problème de découpage. What is object slicing?

Une meilleure approche serait simplement passer le pointeur Ds à la fonction setAttraction (Depuis le premier paramètre de setAttraction est le pointeur de la classe de base, donc il fonctionne). Quelque chose comme ceci ::

Dubai.setAttraction(Ds, x); 

Et dans la classe de base Attraction définissant la fonction getName comme virtuelle, de sorte qu'il peut être utilisé sur tout type de Attraction (Sport, Culture, Shopping, etc.)

+0

Eh bien, j'ai fait ce que vous avez écrit à l'exception de la fonction virtuelle, car elle a produit un autre thread ** thread 1 exc_bad_access (code = 1 adresse = 0x0) **. Pourtant, je n'obtiens que le premier objet du tableau. –

+0

@MahmoudDawlatly Passez-vous 'Ds' à' setAttraction() '?? Je ne pense pas que ce soit possible, ou probablement il y a un autre code! Et comment savez-vous que vous obtenez seulement le premier objet ?? Pouvez-vous montrer le code complet? Probablement copier/coller tout le code et les classes à ideone.com ou pastebin.com – user007

+0

@MahmoudDawlatly Je me demande s'il y a un problème dans l'héritage, ce qui conduit à l'erreur 'thread 1 exc_bad_access (code = 1 adresse = 0x0)' – user007