2012-12-20 4 views
6

Ich möchte List Klasse mit meiner benutzerdefinierten Klasse umbrechen. Für jetzt habe ich so etwas;Wrapping List.Add() gibt - Objektverweis nicht auf eine Instanz eines Objekts festgelegt

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_); 
    } 
} 

Wenn ich jetzt

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

ich Laufzeitausnahme:

Objektverweis nicht auf eine Instanz eines Objekts festgelegt

Ich habe auch versucht, ohne ref aber mit dem gleichen Ergebnis. Was mache ich hier falsch?

+0

Sehr seltsame Benennungsstil .. in der Regel private Felder haben Unterstrich Präfix, oder sie haben kein Präfix –

+0

@lazyberezovsky Ich verwendete Präfixe verwendet, aber es dauert länger zu schreiben (Sie beenden das Wort Autocomplete). – Patryk

Antwort

9

Sie instanziieren nie eine List<Node>.

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

Vielen Dank dafür! - aus 'C++' zu kommen ist nicht einfach ... – Patryk

1

Standardmäßig haben Klassen leer parameterlos Bauer, so dass Sie effektiv haben:

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

    public PriorityListOfNodes() 
    { 
    } 

    // ... 
} 

Wenn Sie später anrufen Add Ihre Liste deklariert, aber nicht initialisiert. Sie müssen dies irgendwann tun, wahrscheinlich im Konstruktor:

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

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

    // ... 
} 

Using Constructors (C#) See.

Verwandte Themen