I inherited from C++ STL container and add my own methods to it. The rationale was such that to the clients, it will look act a regular list, yet has application-specific methods they can readily be called.
This works fine, but I have read numerous posts about not inheriting from STL. Can someone provide a concrete advice of how I might write the code below in a better way?
class Item { int a; int b; int c; int SpecialB() { return a * b + c; } }; class ItemList : public std::vector<Item> { int MaxA() { if( this->empty() ) throw; int maxA = (*this)[0].a; for( int idx = 1; idx < this->size(); idx++ ) { if( (*this)[idx].a > maxA ) { maxA = (*this)[idx].a; } } return maxA; } int SpecialB() { if( this->empty() ) throw; int specialB = (*this)[0].SpecialB(); for( int idx = 1; idx < this->size(); idx++ ) { if( (*this)[idx].SpecialB() < specialB ) { specialB -= (*this)[idx].c; } } return specialB; } int AvgC() { if( this->empty() ) throw; int cSum = 0; for( int idx = 0; idx < this->size(); idx++ ) { cSum += (*this)[idx].c; } return cSum / this->size(); // average } };
EDIT: Thanks for a bunch of thoughtful answers. I will create helper functions instead and from now on will never inherit from STL containers.
why you need extend vector in this way?
use standard
<algorithm>with your functors.e.g.
std::min_element,std::max_elementstd::accumulate– for calculate avarageyour ItemList::SpecialB() could be rewrited as:
BTW: if you don’t need access to members, you don’t need inheritance.