2011-04-19 75 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; 

}