000
17.10.2006, 10:46 Uhr
J-jayz-Z
Perl Crack ala Carte (Operator)
|
Ich arbeite in meinen Projekten recht viel mit gettern und settern, da ich aus der Java Welt komme. Jetzt habe ich aber das Problem, das ich eine Stackoverflowexception bekomme, wenn ich mit gettern und settern arbeite. Bei public cariablen geht alles einwandfrei.
Ich hab mir das alles im Debugger mal angesehen und er springt immer wieder zum setter. Wie in einer Endlosschleife. Es sind zwar 3 Schleifen ineinander verschachtelt, sind aber keine Endlosschleifen. Und wie gesagt, wenn ich anstatt den setter zu benutzen direkt auf die öfentliche Variable zugreife funktioniert das einwandfrei. Hier mal einmal der Code, der den Fehler erzeugt und die einfache Klasse, in der die getter und setter nicht funktionieren.
C++: |
XmlReader( String url ) { values = new Hashtable(); faecher = new List<string>(); XmlDocument doc = new XmlDocument(); doc.Load(url);
XmlElement root = doc.DocumentElement; XmlNodeList faecherList = root.ChildNodes; foreach(XmlNode article in faecherList) { XmlNodeList entries = article.ChildNodes; Hashtable testingtable = new Hashtable(); foreach(XmlNode entry in entries) { XmlNodeList items = entry.ChildNodes; XmlAttributeCollection atts = entry.Attributes; XmlAttribute id = atts["id"]; foreach(XmlNode item in items) { /* z.B.: * article.Name == "Englisch" * item.Name == "content" * item.InnerText == "foo" * id.InnerText == "2" */ if(item.Name == "content") { _content = item.InnerText; } else if(item.Name == "title") { _headline = item.InnerText; } else if(item.Name == "datum") { _date = item.InnerText; } } _id = int.Parse(id.InnerText); faecher.Add(article.Name); //hier kommt die StackOverflowException - aber nur bei den get und set val = new XmlValues(article.Name, _headline, _date, _content, _id); values.Add(_id, val); }
}
|
Und hier meine funktionierende XmlValues:
C++: |
using System; using System.Collections.Generic; using System.Text;
namespace SchoolWriter.XMLKlassen { class XmlValues { public XmlValues( string fachName, string headline, string datum, string content, int id ) { this.FachName = fachName; this.Headline = headline; this.Content = content; this.Datum = datum; this.id = id; }
public string Headline = null; /*{ get { return headline; } set { headline = value; } }*/
public string FachName = null; /*{ get { return this.FachName; } set { this.FachName = value; } }*/
public string Datum = null; /*{ get { return Datum; } set { Datum = value; } }*/
public string Content = null; /*{ get { return Content; } set { Content = value; } }*/
public int id ; /*{ get { return id; } set { id = value; } }*/ } }
|
Wenn ich aber beispielsweise Content so anpasse:
C++: |
public string Content { get { return Content; } set { Content = value; } }
|
Geht nichts mehr. Visual Studio sagt mir nur: "Stellen Sie sicher, das Sie sich in keiner Endlosschleife befinden". Bin ich definitiv nicht ...
Jemand ne Idee ? Also der Code funktioniert zwar, trotzdem würde ich des Designs halber lieber mit gettern und settern arbeiten, vor allem um bei get evtl auch direkt Datentypkonvertierungen durchführen zu können. -- perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"' |