2011-04-19 53 views
3

我有一個基類玩具和派生類Toy_remote_car和Toy_battery_car。用雙指針動態分配

我這樣做:

Toy** ptr; 
ptr=new Toy*; 
ptr[0]=new Toy_remote_car[1]; 
ptr[1]=new Toy_battery_car[1];/*this is completely wrong according to my teacher because i never created ptr[1]. Instead this is a misuse of memory according to him.*/ 

上面的代碼(PTR =新玩具*)是創造型玩具的單個指針(PTR [0]),它包含派生類Toy_remote_car的對象。

現在我想寫這樣的代碼:

- >的玩具類型指針的數目不應當被預定義。

- >相反,我會調用一個add_toy函數,它會創建一個指向我想要的對象類型的ptr。此外,如果我再次調用add_toy函數,它不應該將數據分配給previos ptr,但它應該創建一個新的ptr。以下約定可能會有所幫助:

ptr[0]=new Toy_remote_car[1]; 
/*we want to add more toys so add_toy function called. A check is applied.*/ 
/*The check checks that ptr[0] already contains a value so it creates another pointer ptr[1]*/ 
ptr[1]=new Toy_battery_car[1]; 

- >此外,我將能夠訪問所有以前的數據。簡而言之:

ptr[0]//contains one type of data. 
ptr[1]//contains another type. 
//and so on 

- >所以每當被增加了一個新玩具時,將自動創建型玩具的一個指針(PTR)。

我希望我已經很好地解釋了我在這段代碼中實現的內容。

請在這方面幫助我。

感謝

+0

**爲什麼在這個世界上**你是否在免費店裏分配指針?!?! – 2011-04-19 20:51:43

回答

7
Toy **ptr = new Toy *[n]; 

其中n持有你想Toy指針數。越來越多的陣列是很難的,但它可以做到:

// Add x to toypp, an array of n pointers 
// very stupid, linear-time algorithm 
Toy **add_toy(Toy *x, Toy **toypp, size_t n) 
{ 
    Toy **new_toypp = new Toy*[n+1]; 

    // copy the old array's contents 
    for (size_t i=0; i<n; i++) 
     new_toypp[i] = toypp[i]; 
    toypp[n] = x; 

    // clean up 
    delete[] toypp; 

    return new_toypp; 
} 

注意如果分配失敗,老toypp和所有的指針在它不清理。真的,如果你想,生長陣列,使用vector<Toy*>代替:

vector<Toy*> toy_ptrs(n); 

push_back添加玩具。

別忘了 ,並用第一種方法,delete[]Toy**

處理各種數據可以通過繼承完成。

+0

矢量做什麼? – Rafay 2011-04-19 19:44:52

+0

此外,由於玩具商店沒有特定數量的玩具,因此n未知。 – Rafay 2011-04-19 19:45:29

+0

@Spoilt:閱讀向量,它們應該在每本C++書中都有涉及。簡短的故事是:他們是爲你做內存管理(一部分)並且可以動態增長的數組。 – 2011-04-19 19:46:44

0

我已經拿出一個非常簡單的邏輯代碼。這工作完全正常。請看一看,並發表意見。

void add_toy_var() 
{ 
    temp=NULL; 
    temp=tptr; 
    tptr=NULL; 
    delete[] tptr; 
    C1.count1++; 
    tptr=new Toy*[C1.count1]; 
    if(temp!=NULL) 
    { 
     for(int i=0; i<(C1.count1-1); i++) 
     { 
      tptr[i]=temp[i]; 
     } 
    } 


    int choice2; 
    cout<<"Which Toy you want to add?"<<endl; 
    cout<<"1. Remote Toy Car"<<endl; 
    cout<<"2. Batt powered toy car"<<endl; 
    cout<<"3. Batt powered toy bike"<<endl; 
    cout<<"4. Remote control toy heli"<<endl; 
    cin>>choice2; 
    if(choice2==1) 
    {      
     tptr[C1.count1-1]=new Toy_car_rem[1]; 
     tptr[C1.count1-1]->set_data(); 
    } 
    else if(choice2==2) 
    { 
     tptr[C1.count1-1]=new Toy_car_batt[1]; 
     tptr[C1.count1-1]->set_data(); 
    } 
    else if(choice2==3) 
    { 
     tptr[C1.count1-1]=new Toy_bike_batt[1]; 
     tptr[C1.count1-1]->set_data(); 
    } 
    temp=NULL; 
    delete[] temp; 

}