我有一个适用于std :: vector的模型,用于对特定于域的对象的容器进行建模。我想向用户公开大多数std :: vector API,以便他们可以在容器上使用熟悉的方法(大小,清除,在等)和标准算法。在我的设计中,这似乎是我反复出现的模式:
class MyContainer : public std::vector<MyObject>
{
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)
};
我知道在将类重用于实现时偏向于继承而不是继承的做法-但一定有限制!如果我将所有内容都委派给std :: vector,那么(根据我的数量)将有32个转发函数!
所以我的问题是……在这种情况下继承实现真的很糟糕吗?有什么风险?是否有一种更安全的方式无需太多输入即可实现此目的?我是使用实现继承的异端吗?:)
编辑:
明确指出用户不应通过std :: vector <>指针使用MyContainer:
// non_api_header_file.h
namespace detail
{
typedef std::vector<MyObject> MyObjectBase;
}
// api_header_file.h
class MyContainer : public detail::MyObjectBase
{
// ...
};
Boost库似乎一直在执行此操作。
编辑2:
建议之一是使用自由功能。我将在这里显示为伪代码:
typedef std::vector<MyObject> MyCollection;
void specialCollectionInitializer(MyCollection& c, arguments...);
result specialCollectionFunction(const MyCollection& c);
etc...
一种更OO的方式:
typedef std::vector<MyObject> 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.
}