2017-04-19 60 views
0

這是我在Stackoverflow上的第一個問題。我正在使用C++在GP142上創建一個繪圖程序,而且我無法重新創建畫布。 當加載程序,它要求(包含x和y或頂點)的點,並創建一個形狀(這是一類)通過結合所有這些點。我將點保存在一個點*向量中:如何創建對象變量,以便每次都分配新的指針?

vector<shape*> arr; 

當一個形狀完成時,它應該保存在向量數組中。我正在使用它來保存它:

line l(points,2); //2 is num of points 
l.draw(); 
arr.push_back(&l); 

有5種不同的形狀類型,並且都是在一個while(true)循環內創建的,它終止於菜單選擇。從菜單中選擇撤消,最後創建的形狀將被刪除。 我使用其刪除:

if (arr.size() > 0) { 
    for (int i = 0;i < arr.size() - 1;i++) { 
     arr[i]->draw(); 
    } 
    arr.pop_back(); 
} 

當我做撤消,它會刪除所有同類型的形狀。喜歡它刪除我創建的所有。有沒有我可以區分所有和其他變量,因此他們可能被顯式刪除任何方法?

謝謝。

回答

1

我看到一對夫婦的問題。首先,你在while循環中創建了line,所以當循環結束並且你的行超出範圍時,向量中的所有指針都是懸掛指針,即指向已被銷燬的line。根據您的要求,您可以使用std::unique_ptr s或std::shared_ptr s來避免此問題。假設你去shared_ptrs那麼你的矢量的類型應該是std::vector<std::shared_ptr<shape>>,並在循環中,您將有

auto a_line = std::make_shared<line>(points,2); //2 is num of points 
a_line->draw(); 
arr.push_back(a_line); 

其次,去除矢量的最後一個元素,所有你需要做的就是arr.pop_back()提供的數組不空。

0

要刪除矢量arr的最後一個元素:

if (!arr.empty()) 
    arr.pop_back(); 
+0

如果(arr.size()> 0) 實際上意味着同一 –

相關問題