We're experimenting with having bounded primitive types in our project where we can check that instances of derived classes have a data value within valid range (min and max member variables, protected in base class) for that derived class.
My question is, is there a way I can statically initialise the derived class's min and max variables, just once per derived class, rather than every time I instantiate the derived class.
In C# this would be in a static initialisation block, but I'm not sure how to do it in C++.
I know I could initialise them in the derived class constructor, but this seems wasteful to do it each time.
I think I'm looking for abstract data members, declared in a base class, but subequently defined statically in derived classes.
class BoundedFloat
{
public:
BoundedFloat(const float v) : Value(v) {}
// some common methods that use Min and Max
// prefer to implement in base class rather than in each derived class
bool withinBounds();
bool breachedLowerThreshold();
bool breachedUupperThreshold();
protected:
const float Min;
const float Max;
float Value;
}
bool BoundedFloat::withinBounds()
{
return ((Value >= Min) && (Value<= Max));
}
bool BoundedFloat::breachedLowerThreshold()
{
return (Value < Min);
}
bool BoundedFloat::breachedUupperThreshold()
{
return (Value > Max);
}
class Temperature : public BoundedFloat
{
public:
Temperature(const float v) : BoundedFloat(v) {}
// seems wasteful to do this each time, when min and max only need
// initialised once per derived class
// Temperature(const float v) : BoundedFloat(v, -40.0f, 80.0f)
// statically initialise Temperature's Min and Max in base class here somehow?
private:
// I know this is wrong, but it indicates the functionality I'm looking for.
override static float Min;
override static float Max;
}