2015-12-20 73 views
0

我是一名正在使用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對不起,但你能告訴我這個問題不是最小的,完整的或可驗證的,特別是在你編輯它之後,我感謝你。代碼太長,所以這是我可以做的最好的顯示問題。我還強調了代碼中問題的位置。 –

回答

2

的問題是你的功能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