2012-12-20 41 views
6

Tôi muốn bọc List lớp với lớp tùy chỉnh của mình. Bây giờ tôi có một cái gì đó như thế này;Danh sách gói .Thêm() cho - Tham chiếu đối tượng không được đặt thành một thể hiện của đối tượng

public class PriorityListOfNodes 
{ 

    private List<Node>   list_; 
    private IComparer<Node>  sorter_; 

    public List<Node> List_ { 
      get {return list_;} 
      set {list_ = value;} 
    } 

    public PriorityListOfNodes() 
    { 
      sorter_ = new NodeSorter_fValueDescending(); 
    } 

    public Node PopFromEnd() 
    { 
      Node temp = new Node (list_ [list_.Count - 1]); 
      list_.RemoveAt (list_.Count - 1); 
      return temp; 
    } 

    public Node PeekFromEnd() 
    { 
      return list_ [list_.Count - 1]; 
    } 

    public void Add (ref Node toAdd) 
    { 
      Debug.Log (toAdd); 
      list_.Add (toAdd); 
      list_.Sort (sorter_); 
    } 
} 

Khi tôi làm bây giờ

Node temp = new Node(10,20); //custom constructor 
PriorityListOfNodes l = new PriorityListOfNodes(); 
l.add(temp); 

tôi nhận được ngoại lệ thời gian chạy:

Object tài liệu tham khảo không được đặt để một thể hiện của một đối tượng

Tôi cũng đã cố gắng mà không ref nhưng có cùng kết quả. Tôi làm gì sai ở đây ?

+0

Kiểu đặt tên rất lạ .. thường là trường riêng có tiền tố gạch dưới hoặc không có tiền tố –

+0

@lazyberezovsky Tôi đã sử dụng tiền tố được sử dụng nhưng phải mất nhiều thời gian để viết (bạn hoàn thành tự động điền từ). – Patryk

Trả lời

9

Bạn chưa bao giờ thực sự khởi tạo List<Node>.

public PriorityListOfNodes() 
    { 
      sorter_ = new NodeSorter_fValueDescending(); 
      list_ = new List<Node>(); 
    } 
+0

Cảm ơn rất nhiều vì điều đó! - đến từ 'C++' không dễ ... – Patryk

1

Theo mặc định, các lớp học có nhà xây dựng parameterless rỗng, vì vậy bạn có hiệu quả có:

public class PriorityListOfNodes 
{ 
    private List<Node> list_; 
    // ... 

    public PriorityListOfNodes() 
    { 
    } 

    // ... 
} 

Khi bạn sau đó gọi Add danh sách của bạn được khai báo, nhưng không được khởi tạo. Bạn cần thực hiện việc này tại một số thời điểm, có thể là trong hàm tạo:

public class PriorityListOfNodes 
{ 
    private List<Node> list_; 
    // ... 

    public PriorityListOfNodes() 
    { 
     this.list_ = new List<Node>(); 
     // ... 
    } 

    // ... 
} 

Xem Using Constructors (C#).

Các vấn đề liên quan