void*
's. In this case, the envelope can't determine equality among its fields and cannot meaningfully determine when it is equal to another. Other Taligent examples are TView, TStream, TMonitor, and TThreadProgram.
NOTE
Taligent's MCollectible might force you to supply equality; make it very clear with comments and documentation that this is temporary.
One good test is that where assignment doesn't make sense, equality doesn't either. If you cannot define
operator=
, you shouldn't define operator=
=
. Equality sample
If different subclasses are always unequal, your equality operator should follow this general form. You can skip step 2 in the following code if your superclass already checks it. If you do have cases where objects of different classes should compare equal, then you have a bit more work to do:
It is usually more efficient to define // TB inherits from TA
Boolean TB::operator == (const TB& other) const {
Boolean result;
// Step 1. fast address check, useful if it occurs often
if (this == &other) result = TRUE;
// Step 2. must be same class
else if (typeid(*this) != typeid(other)) result = FALSE;
// Step 3. check superclasses ==
else if (TA::operator!=(other)) result = FALSE;
// Step 4. fields
else if (fField1 == other.fField1 && fFieldN == other.fFieldN) result = TRUE;
return result;
};
operator=
=
as a global function. Do this for the highest class in your hierarchy, where that class' definition should include steps 1 and 2 of the example, and a call to a protected member function PrivateEquality(const TMyClass&)
. Any subclass then needs to override PrivateEquality to do steps 3 and 4. This makes sure that if X== Y, then Y==X, and avoids making multiple checks in steps 1 and 2.
[Contents]
[Previous]
[Next]
Click the icon to mail questions or corrections about this material to Taligent personnel.
Generated with WebMaker