2010-10-01 107 views
2

這是一個代碼段使用:分配值的指針在C++

void Move::AddToMovesList(Location* &list, int row, int col) { 
    // If the list is empty, create the first item 
    if (list == NULL) 
     list = new Location(row, col); 
    // List exists, so append 
    else 
     list->Add(row, col); 
} 

list如果是NULL,應創建一個新的Location和指針list應該指向新的位置。這是我期望的代碼行爲,但在gdb退出此功能之前,我注意到list仍然是NULL。我在這裏做錯了什麼?

我使用Location* &list中的&符號來確保我可以永久(與本地)更改提供的指針。

+4

我個人不會使用指針。您將空列表作爲空指針來表示。這意味着您需要添加代碼來明確檢查代碼中的任何位置。創建一個對象(最初代表空列表),然後添加成員到它沒有特殊情況下需要。 – 2010-10-01 18:11:16

+1

你的代碼應該可以工作,你在調試時關閉了優化嗎? – 2010-10-01 18:15:25

+0

我不確定我是否知道你在說什麼,文森特。我在默認設置下使用Eclipse內部的gdb。我在Windows上,並使用MinGW C++編譯器。 – Pieter 2010-10-01 18:27:11

回答

0

就我個人而言,我不會使用指針。

class Location 
{ 
    public: 
     void add(int row, int col) 
     { 
      data.push_back(std::make_pair(row,col)); 
     } 
     bool isEmpty() const {return data.empty(); } 
    private: 
     std::vector<std::pair<int,int> > data; 
}; 


class Move 
{ 
    public: 
     // Pass a reference to the list. 
     // No special case processing if the list is empty. 
     // No problems with ownership. 
     // No problems with lifespan associated with new/delete 
     void addToMoveList(Location& list, int row, int col) 
     { 
      list.add(row, col); 
     } 
}; 

int main() 
{ 
    Location list; // Don't use new if you can declare a local variable. 
    Move  move; 

    move.addToMoveList(list, 10, 2); 
} 
+0

看起來更容易實現,但正如我在另一條評論中提到的,我正在使用C++進行學校項目,而且我們幾乎沒有涉及任何C++特有的優勢。我不允許使用我們在項目中沒有涉及的東西,所以現在我認爲我必須堅持創建動態鏈接列表的C選擇。 – Pieter 2010-10-01 18:25:29

+0

@Pieter - 你可能不被允許使用STL等,但是你不需要用C風格去做,通過新的/刪除/ malloc/free和raw指針的強大的內存管理。 – 2010-10-01 19:02:52

1

讓我們不要在這裏重塑車輪... Know your libraries.

如果使用STL列表容器(或任何其他容器),那麼你就不需要用空指針打擾。

+0

我正在爲一個學校項目做這件事,到目前爲止我們還沒有在我們的C++課程中列出清單,所以不幸我不允許使用它們。 – Pieter 2010-10-01 18:20:02