相关疑难解决方法(0)

是否可以从STL容器继承实现,而不是委托?

我有一个类,它适应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)
};
Run Code Online (Sandbox Code Playgroud)

我知道在重用类实现时更喜欢使用组合继承的做法 - 但是必须有限制!如果我将所有内容委托给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
{
   // ... …
Run Code Online (Sandbox Code Playgroud)

c++ stl

73
推荐指数
5
解决办法
3万
查看次数

从C++ 11中的STL容器继承

我一直在考虑从C++ 11中继承STL容器.我知道如果没有一些考虑因素就不应该这样做,因为没有虚拟析构函数.

根据我的理解,使用typedef是为STL容器命名的首选方法.

但是,typedef本身并非没有问题.首先,它们不能轻易地向前声明,并且两个typedef可能意外地是相同的类型.

请考虑以下事项:

typedef std::vector<int> vec_a_t;
typedef std::vector<float> vec_b_t;

void func(const vec_a_t& v);
void func(const vec_b_t& v);
Run Code Online (Sandbox Code Playgroud)

这两个函数的行为应根据逻辑类型vec_a_t或不同而有所不同vec_b_t

这种情况将正常工作,直到有人改变vec_a_t

typedef std::vector<float> vec_a_t;
Run Code Online (Sandbox Code Playgroud)

现在打电话func()突然变得含糊不清.一个现实的例子func()

std::ostream& operator<<(std::ostream& ost, const vec_a_t& v);
Run Code Online (Sandbox Code Playgroud)

现在,如果我们改为继承

class Vector : public std::vector<int>
{};

std::ostream& operator<<(std::ostream& ost, const Vector& v);
Run Code Online (Sandbox Code Playgroud)

也可以宣布

class Vector2 : public std::vector<int> {};

std::ostream& operator<<(std::ostream& ost, const Vector2& v);
Run Code Online (Sandbox Code Playgroud)

这显然是消除歧视.

但是,因为std::vector没有从它们派生的虚拟析构函数,所以这是错误的并且可能导致问题.

相反,我们尝试

class Vector : private std::vector<int>
{
public:
   using::size;
   //Add …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance stl vector c++11

6
推荐指数
2
解决办法
1776
查看次数

标签 统计

c++ ×2

stl ×2

c++11 ×1

inheritance ×1

vector ×1