Weak Pointers and Circular References in C++ 11: Listing 1
Spouses referencing each other (in C# and Java).
// C# version
class Person {
public Person(string name) {
this.Name = name;
Console.WriteLine(this.Name + " instance created.");
}
~Person() {
Console.WriteLine(this.Name + " instance to be disposed.");
}
public string Name { get; private set; }
private Person spouse;
public Person Spouse {
get { return spouse; }
set { this.spouse = value; spouse.spouse = this; }
}
}
class CircularReference {
static void GetCoupleMarried() {
Person husband = new Person("John"), wife = new Person("Pocahontas");
husband.Spouse = wife;
Console.WriteLine(husband.Name + "'s wife is " + husband.Spouse.Name + ".");
Console.WriteLine(wife.Name + "'s husband is " + wife.Spouse.Name + ".");
}
static void Main(string[] args) {
GetCoupleMarried();
GC.Collect();
}
}
/* ---------------------------------- */
// Java version
public class Person {
public Person(String name) {
this.name = name;
System.out.println(this.name + " instance created.");
}
protected void finalize() throws Throwable {
System.out.println(this.name + " instance to be disposed.");
}
// no auto-implemented properties in Java
private String name;
public String getName() {
return name;
}
private Person spouse;
public Spouse getSpouse() {
return spouse;
}
public void setSpouse(Person spouse) {
this.spouse = spouse;
spouse.spouse = this;
}
}
public class CircularReference {
static void getCoupleMarried() {
Person husband = new Person("John"), wife = new Person("Pocahontas");
husband.setSpouse(wife);
System.out.println(husband.getName() + "'s wife is " + husband.getSpouse().getName() + ".");
System.out.println(wife.getName() + "'s husband is " + wife.getSpouse().getName() + ".");
}
public static void main(String[] args) {
getCoupleMarried();
System.gc();
}
}
About the Author
Diego Dagum is a software architect and developer with more than 20 years of experience. He can be reached at [email protected].