Optional Data Members
On this page:
Overview of Optional Data Members
A data member of a Slice class or exception may be declared as optional to indicate that a program can leave its value unset. Data members not declared as optional are known as required members; a program must supply legal values for all required members.
Declaring Optional Data Members
Each optional data member in a type must be assigned a unique, non-negative integer tag:
module M
{
class C
{
string name;
bool active;
optional(2) string alternateName;
optional(5) int overrideCode;
}
}
It is legal for a base type's tag to be reused by a derived type:
exception Base
{
optional(1) int systemCode;
}
exception Derived extends Base
{
optional(1) string diagnostic; // OK
}
The scope of a tag is limited to its enclosing type and has no effect on base or derived types.
Language mappings specify an API for setting an optional member and testing whether a member is set. Here is an example in C++:
auto c = make_shared<C>();
c->name = "xyz"; // required
c->active = true; // required
c->alternateName = "abc"; // optional
c->overrideCode = 42; // optional
if(c->alternateName)
{
cout << "alt name = " << c->alternateName << endl;
}
CPtr c = new C;
c->name = "xyz"; // required
c->active = true; // required
c->alternateName = "abc"; // optional
c->overrideCode = 42; // optional
if(c->alternateName)
{
cout << "alt name = " << c->alternateName << endl;
}
As you can see, the C++ language mapping makes setting an optional member as simple as assigning it a value. Refer to the language mapping sections for more details on the optional data member API.
A well-behaved program must test for the presence of an optional member and not assume that it is always set. Dereferencing an unset optional member causes a run-time error.
In all supported language mappings, an optional data member's initial condition is unset if not otherwise assigned during construction. Again using C++ as an example:
auto c = make_shared<C>(); // default constructor
assert(!c->alternateName); // not set
c = make_shared<C>("xyz", true, "abc", 42); // one-shot constructor
assert(c->alternateName); // set by constructor
CPtr c = new C; // default constructor
assert(!c->alternateName); // not set
c = new C("xyz", true, "abc", 42); // one-shot constructor
assert(c->alternateName); // set by constructor
Optional Data Members with Default Values
You can declare a default value for optional members just as you can for required members:
class C
{
string name;
bool active = true;
optional(2) string alternateName;
optional(5) int overrideCode = -1;
}
An optional data member with a default value is considered to be set by default:
auto c = make_shared<C>(); // default constructor assert(!c->alternateName); // not set assert(c->overrideCode); // set to default value
CPtr c = new C; // default constructor assert(!c->alternateName); // not set assert(c->overrideCode); // set to default value
Each language mapping provides an API for resetting an optional data member to its unset condition.