Next: Prefixes, Previous: Self and super, Up: Methods [Index]
Some classes that have class variables require initialization when the
program is run. For example, class ReadFileStream
needs to
have its class variable stdinStream
set to the application’s
stdin
file stream before the program can read from standard
input. For this, you would use the library function xstdin,
and use its value in stdinStreamVar
.
__ctalkObjValPtr (stdinStreamVar, xstdin ());
Classes that require class variable initialization need to define a
method, classInit
, which is called by a constructor when the
first object is created. An example is the ReadFileStream
method new
from the previous section.
Here is the classInit
method for class ReadFileStream
.
ReadFileStream classMethod classInit (void) { "Initializes the classes' standard input stream. This method is normally called by the ReadFileStream constructor. The method needs to be called only once; on further calls to 'new', it is a no-op." OBJECT *classObject, *stdinStreamVar, *classInitVar; if (self classInitDone) return NULL; classObject = __ctalkGetClass ("ReadFileStream"); stdinStreamVar = __ctalkFindClassVariable ("stdinStream", TRUE); __ctalkInstanceVarsFromClassObject (stdinStreamVar); __ctalkObjValPtr (stdinStreamVar, xstdin ()); classInitVar = __ctalkCreateObjectInit ("classInitDone", "Integer", "Magnitude", classObject -> scope, "1"); __ctalkAddClassVariable (classObject, "classInitDone", classInitVar); return NULL; }
A classInit
method needs to be called only once. The method
checks the classInitDone
instance variable to determine the
method has already performed the initialization that the class needs.