2011-12-06 28 views
0

我有对象指针:(阵列的问题..如何管理指向对象的指针数组?

我需要生成对象的动态矢量,然后在 以操纵它在另一个类中返回。在下面的代码有 事件类是抽象的,CarArrival,从它继承和 可以被实例化

产生,并填补了阵列我有这个功能的类中:

Event** EventGenerator::getEvents() { 

Event* cars[EVENTS]; 

for (int i=0; i<EVENTS; i++) { 
    cars[i] = new CarArrival(generator->getNextNumber(8,(float)sqrt(0.4))); 
} 

sort(cars, cars+(EVENTS), Event::cmp); 

return cars; 

}

我援引onther类此功能以这样的方式


Event** cars = generator->getEvents(); 

for(int i=0; i<EVENTS; i++) { 
    cout << i <<":" << (*cars)[i]->getScheduleTime() << endl; 
} 

的第一个元素的打印后,我得到“段错误”。

我已经在线阅读了一些东西,我知道我错误,因为(*汽车)评估为 指向数组的第一个元素,实际上我可以打印第一个元素而不是其他,但我不能弄清楚如何访问第二类中数组的每个元素。

我该如何面对这个问题?

感谢所有,

阿尔贝托

+0

“我需要生成一个对象的动态矢量**”......嗯,如果只有一个“std :: vector”... –

+0

如果你真的必须使用指针。尽可能使用STL,经过良好测试,可为您节省很多麻烦。 – hochl

回答

5

我建议您使用std::vector<Event*>代替。这样可以节省很多痛苦。它会在后台处理所有讨厌的内存管理,并且您可以轻松地将任意数量的项目放入其中。你的情况最好的部分是,你可以简单地return a vector这是不安全的一个正常的数组。

此外,您的Event* cars[EVENTS];在您的本地函数中声明。完成后,它不复存在,其中可能导致您的Segfault。您必须动态分配new的数组,但仍然可以使用std::vector进行尝试,请参阅documentation here

编辑:用法示例:

std::vector<Event*> EventGenerator::getEvents() { 
    std::vector<Event*> cars; 
    for (int i=0; i<EVENTS; i++) { 
     cars.push_back(new CarArrival(generator->getNextNumber(8,(float)sqrt(0.4)))); 
    } 

    sort(cars.begin(), cars.end(), Event::cmp); 

    return cars; 
} 

std::vector<Event*> cars = generator->getEvents(); 

for(int i=0; i<cars.size(); i++) { 
    cout << i <<":" << (*cars)[i]->getScheduleTime() << endl; 
} 
+0

非常感谢你! – kappaalby

2

难道不如归去vector<Event*>vector<shared_ptr<Event>>,而不是原始指针的?这样,您将获得:内存管理

  • 动态数组的

    1. 自动化内置的长度,而不是固定一个
  • 2

    正如mentionned由Constantinuis,你是返回一个指针的值到仅在getEvents()函数范围内有效的内存位置(它在堆栈中分配)。下次你肯定会遇到段错误。

    你可能想在堆中为这个数组分配内存(如果我的C++不是太生锈的话,使用'new'),然后你将不得不处理以后释放内存。

    http://www.linuxtopia.org/online_books/programming_books/thinking_in_c++/Chapter13.html

    +0

    不错,我会通过这个帮助使用!谢谢! – kappaalby

    3

    我相信处理指针的动态矢量最干净的方式来动态分配的对象是use a boost::ptr_vector。它处理你需要的一切,包括分配空间来存储指针,然后删除这些指针。

    相关问题