Code: Select all
class MyContainer : public std::vector
{
public:
// Redeclare all container traits: value_type, iterator, etc...
// Domain-specific constructors
// (more useful to the user than std::vector ones...)
// Add a few domain-specific helper methods...
// Perhaps modify or hide a few methods (domain-related)
};
Meine Fragen sind also... Ist das wirklich so? Ist es in solchen Fällen schlecht, die Implementierung zu erben? Was sind die Risiken? Gibt es eine sicherere Möglichkeit, dies umzusetzen, ohne so viel tippen zu müssen? Bin ich ein Ketzer, weil ich die Implementierungsvererbung verwende?

Bearbeiten:
Wie wäre es damit, klarzustellen, dass der Benutzer dies tun sollte? Verwenden Sie MyContainer nicht über einen std::vector-Zeiger:
Code: Select all
// non_api_header_file.h
namespace detail
{
typedef std::vector MyObjectBase;
}
// api_header_file.h
class MyContainer : public detail::MyObjectBase
{
// ...
};
Edit 2:
Einer der Vorschläge war, kostenlose Funktionen zu nutzen. Ich zeige es hier als Pseudocode:
Code: Select all
typedef std::vector MyCollection;
void specialCollectionInitializer(MyCollection& c, arguments...);
result specialCollectionFunction(const MyCollection& c);
etc...
Code: Select all
typedef std::vector MyCollection;
class MyCollectionWrapper
{
public:
// Constructor
MyCollectionWrapper(arguments...) {construct coll_}
// Access collection directly
MyCollection& collection() {return coll_;}
const MyCollection& collection() const {return coll_;}
// Special domain-related methods
result mySpecialMethod(arguments...);
private:
MyCollection coll_;
// Other domain-specific member variables used
// in conjunction with the collection.
}