Ravi
Welcome
Documentation
Documentation
About Ravi
Documentation
Introduction
Premiers pas avec Ravi
ravitool
Scheme Tutorial
Objets Scheme
Le shell ravi
Starting Ravi
Le module trace
Les ports d'E/S
The C Parser
load, require, modules
Système d'interruptions
Scheme compiler
C++ mode
Generating C++ Modules
La déclaration struct
Le type "C-object"
More information
Installation

[PREV][SUIV]

La déclaration struct

Un struct peut jouer plusieurs rôles dans la programmation en C/C++, et de ce fait il y a plusieurs variantes pour l'interfacer.

En C, le struct définit un type d'enregistrement comme on le connait en Pascal. L'interface doit produire des fonction d'accès à ces champs, et un "constructeur" permettant de créer des nouveaux enregistrements. En C++, entre struct et class il n'y a pas de différence importante,, et on peut se demander pourquoi il y a cette redondance dans le langage.

La déclaration "struct" permet un contrôle fin sur la facon dont un struct est interfacé.

La déclaration "struct" est modelée d'après la déclaration de classe, sont format est tout à fait semblable:

(struct id prop ...)
prop ::= prop-name | (prop-name value)

Les propriétés qu'on peut indiquer sont un peu plus nombreuses que celles des classes.

Les propriétés sont:

  • is-class
  • make-constructor
  • export-fields
  • export-methods
  • print print-function
  • print-method
  • delete delete-function
  • delete-method
  • reference-count
  • reference-count-methods
  • dynamic-type

print-function peut ne pas donner valeur: elle sera générée.

Toutes les propriétés ont des valeurs par défaut, qu'on peut changer par déclaration, voir la variable-scheme *struct-defaults*

La propriété is-class indique si on veut que le struct soit traité comme une classe.

Les formes utiles de cette propriété:


	is-class
	(is-class #f)

Valeur par défaut: #f.

Si un struct n'est pas traité comme une classe, on n'utilise pas le send pour activer les différentes fonctions, mais les fonctions directement.

La propriété make-constructor indique qu'un constructeur sans arguments doit être généré; ce sera utile si le struct n'en possède pas par ailleurs.

Valeurs par défaut:


(define *struct-defaults* '((export-fields #t) (export-methods #f)
			    (is-class #f) (make-constructor #t)))

(define *class-defaults* '((export-fields #f) (export-methods #t) ))

La propriété export-fields définit les possibilités d'accès aux champs qui ne sont pas des méthodes. Pour chaque champs, on définit une valeur qui peut être

  • #t accès en lecture/écriture
  • #f pas d'accès
  • get lecture seulement
  • set modification seulement

Les format utiles de cette propriété:


	export-fields  donne la valeur #t pour tous les champs
	(export-fields #f) donne la valeur #f pour tous les champs
	(export-fields get) donne la valeur #f pour tous les champs
	(export-fields nom1 nom2 ...)  dosage plus fin
	(export-fields (nom1 get) nom2 ...) encore plus fin

Valeur par défaut: #f.

La propriété export-methods définit l'exportation des méthodes, dans une classe.