Exercice 4 – Présentation avancée des classes C++ et Java (Hors
TD)
Une classe est introduite comme une extension de structure de donnée (le type struct en C), extension qui
contient une algorithmique locale. L’algorithmique locale est l’algorithmique directe liée à une instance
de classe (= un objet de la classe). Elle s’oppose à l’algorithmique globale qui est quant à elle répartie sur
plusieurs instances de classes.
À titre d’exemple, nous présentons une classe un peu complexe, avec un objet partagé de type
SharedNode entre plusieurs instances de la classe MyObject. Cette classe est définie dans le langage C++
et dans le langage Java. L’objet partagé a pour but de garder cohérents entre elles les différents objets.
Pour cela il a un mécanisme de notification qui peut être appelé à partir de n’importe quel objet
enregistré. Les questions ne requièrent pas une bonne compréhension de ce mécanisme et ont simplement
pour de reconnaître les différents constituants d’une classe, avant de comprendre à quoi elle peut servir.
value
fields
SharedNode
MyObject
value
value
notification
value
value
ENSTA {
class SharedNode;
class MyObject {
private:
int value; /* fields */
char secondaryFields;
Node* sharedNode;
bool simplify(); // private method
public:
// Constructor with default field initializer
MyObject(int valueSource=0) : value(valueSource),
secondaryFields(0), sharedNode(NULL) {}
// Copy constructor
MyObject(const MyObject& source)
: value(source.value), secondaryFields(source.secondaryFields),
sharedNode(source.sharedNode)
{ if (sharedNode) sharedNode->addCaller(*this); }
// Assign operator
MyObject& operator=(const MyObject& source)
{ if (sharedNode && this != &source)
sharedNode->removeCaller(*this);
sharedNode = NULL;
value = source.value;
secondaryFields = source.secondaryFields;
sharedNode = source.sharedNode;
if (sharedNode && this != &source)
sharedNode->addCaller(*this);
return *this;
}
// Destructor
~MyObject()
{ if (sharedNode)
sharedNode->removeCaller(*this);
}
// Simple get and set field access method to complete construction
void incValue() { ++value; }
void decValue() { --value; }
int getValue() const { return value; }
void setValue(int valueSource) { value = valueSource; }
// Elaborate public use methods
void clear()
{ value = 0;
ENSTA;
public class SharedNode;
public class MyObject {
private int value;
private char secondaryFields;
private Node sharedNode;
public MyObject(int valueSource=0)
{ value = valueSource; secondaryFields = 0; sharedNode = null; }
public MyObject(MyObject source)
{ value = source.value;
secondaryFields = source.secondaryFields;
sharedNode = source.sharedNode;
if (sharedNode != null)
sharedNode.addCaller(this);
}
public Object clone() { return new MyObject(this); }
public MyObject assign(MyObject source)
{ if (sharedNode && this != source)
sharedNode.removeCaller(this);
sharedNode = null;
value = source.value;
secondaryFields = source.secondaryFields;
sharedNode = source.sharedNode;
if (sharedNode && this != source)
sharedNode.addCaller(this);
return this;
}
public ~MyObject()
{ if (sharedNode)
sharedNode.removeCaller(this);
}
public void incValue() { ++value; }
public void decValue() { --value; }
public int getValue() { return value; }
public void setValue(int valueSource) { value = valueSource; }
public void clear()
{ value = 0;
secondaryFields = 0;
if (sharedNode)
sharedNode.removeCaller(this);
sharedNode = null;
}
public void mergeWith(MyObject source)