2011-12-06 30 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。它處理你需要的一切,包括分配空間來存儲指針,然後刪除這些指針。

    相關問題