This page provides a simple example of how to:
A is a simple C++ class that maintains a reference (pointer) to
another class A object and provides three methods. The first method,
doIt, is a virtual method that prints a simple message identifying
itself as class A's version of doIt. The second method,
doItNext, invokes the doIt method upon the other class A
object referenced by the private attribute next. The final method,
setNext, can be used to set the next class A object
reference.
Class A is described and implemented in C++ in the following two
files:
#ifndef A_H
#define A_H
// File A.H
class A
{
public:
A (A *next); // Constructor member function
virtual ~A (); // Destructor member function
virtual void doIt (void); // Virtual member function
void doItNext (void); // Member function
void setNext (A *obj); // Member function
private:
A *next; // Member variable
};
#endif // A_H
#include <iostream.h>
#include "A.H"
// File A.C
A::A (A *n)
{
next = n;
cout << "A::constructed" << endl;
}
A::~A ()
{
cout << "A::destructed" << endl;
}
void A::doIt (void)
{
cout << "A::doIt" << endl;
}
void A::setNext (A *n)
{
next = n;
}
void A::doItNext (void)
{
if (next != NULL)
{
next->doIt(); // "doIt" is dynamically bound so it could be the
// "doIt" of class A or a subclass of A.
}
}
The following file contains the CDL for class A. This file
may be processed by the
CDL processor and the resulting C++ files linked
into the final application.
# File A_cdl.cdl
pass {
// Generated from A_cdl.cdl
#include "A.H"
#include "A_cdl.H"
}
class A {
constructor {obref A}
method doIt -dynamic {void} {void} # "doIt" required dynamic binding
method doItNext -static {void} {void}
method setNext -static {obptr A} {void}
# The "A" after the obref type indicates the actual type of the
# parameter expected by the "setNext" method.
}
Class B is a new class described in Object Tcl, below, that inherits
from class A.
Class B provides its own version of the doIt method, that
is also defined in class A. Class B's version of the doIt
method prints a simple message identifying itself and then calls the
doIt method of its parent class (A).
# File B.tcl
otclInterface B -isA A {
constructor {next value}
method doIt {} # Redefines the "doIt" method available in class A
}
otclImplementation B {
# The constructor method passes on its first argument up to
# the constructor of the "A" parent class.
constructor {n v} {{A $n}} {
set value $v
puts "B::constructed with value $value"
}
destructor {
puts "B::destructed"
}
# The new version of the "doIt" method.
method doIt {} {
puts "B::doIt, value is $value, calling A::doIt"
# Invoke the "doIt" method but make sure it is the version
# of the "A" parent class and this version that would be
# chosen by default using dynamic binding.
$this -A doIt
}
attribute value
}
To build a version of the Tcl shell (tclsh) that includes the Object Tcl package,
with class A and class A exported to Object Tcl, perform the
following:
A:
system% CC -c A.C
A:
system% cdl -h A_cdl.cdl A_cdl.H system% cdl -s A_cdl.cdl A_cdl.C
A's CDL
description:
system% CC -I$(OTCL) -I$(TCL) -c A_cdl.C
system% CC -o examplesh -L$(OTCL) -L$(TCL) A.o A_cdl.o \ $(OTCL)/tclAppInit.o -lotcl -ltcl -lm
Note: the files tclAppInit.o and tclMain.o are modified
version of the files from the tcl7.3 distribution. These files have been
modified to initialize the Object Tcl package and compile under C++.
To test the augmented Tcl shell:
system% ./examplesh % source TestB.tcl About to construct an instance of class A A::constructed About to call method doIt on instance of class A A::doIt About to construct an instance of class B A::constructed B::constructed with value 5 About to call method doIt on instance of class B B::doIt, value is 5, calling A::doIt A::doIt Setting instance of class A to point at instance of class B About to call method doItNext on instance of class A B::doIt, value is 5, calling A::doIt A::doIt About to destruct instance of class A A::destructed About to destruct instance of class B B::destructed A::destructed %
Where TestB.tcl is:
# TestB.tcl puts "About to construct an instance of class A" set a [otclNew A ""] puts "\nAbout to call method doIt on instance of class A" $a doIt source B.tcl puts "\nAbout to construct an instance of class B" set b [otclNew B "" 5] puts "\nAbout to call method doIt on instance of class B" $b doIt puts "\nSetting instance of class A to point at instance of class B" $a setNext $b puts "About to call method doItNext on instance of class A" $a doItNext puts "\nAbout to destruct instance of class A" otclDelete $a puts "\nAbout to destruct instance of class B" otclDelete $b

Object Tcl | Overview | Language Reference | C++ Binding Reference | Example | Source Code

otcl@x.co.uk