【发布时间】:2021-10-19 16:31:03
【问题描述】:
作为一个练习,我想构建一个包含std::array<unsigned char, N> 对象的向量(其中N 不同)。
我的尝试是构造一个基类GenericArray,从中派生出MyArray<N>,这样容器实际上就是:std::vector<GenericArray*>。但是,由于实际的数组变量必须驻留在派生类中,因此我看不到使用来自std:vector<GenericArray*> 本身的这些数据的方法。
这是我的全部尝试,显然会产生:error: ‘class GenericArray’ has no member named ‘data’
#include <array>
#include <cassert>
#include <iostream>
#include <vector>
template<std::size_t N>
using arr_t = std::array<unsigned char, N>;
class GenericArray
{
public:
~GenericArray() = default;
};
template<std::size_t N>
class MyArray : public GenericArray
{
public:
arr_t<N> data;
MyArray(const arr_t<N>& data)
{
this->data = data;
}
};
int main(void)
{
std::vector<GenericArray*> vs;
vs.emplace_back(new MyArray<2>({ 'a', 'b' }));
vs.emplace_back(new MyArray<4>({ 'A', 'B', 'C', 'D' }));
assert(vs.size() == 2);
for (const auto& x : vs[0]->data)
{
std::cout << x << "\n";
}
return 0;
}
【问题讨论】:
-
你考虑过
std::vector<std::vector<unsigned char>>吗? -
我知道存在“更明智”的替代方案,但这只是一个练习(我编辑了帖子)。当这可能是一个实际的限制时,我想了解最好的方法。
-
std::vector<std::vector<unsigned char>>是完成此任务的最简单解决方案。你也可以使用std::vector<std::unique_ptr<unsigned char[]>> -
代码还是有缺陷的。
GenericArray析构函数不是virtual。其次,您在代码中引入了new,并且没有对应的delete,因此内存泄漏加上代码更难维护。 -
您似乎混淆了两个概念。如果你想要容器中的基类指针,this 可以工作。
标签: c++ containers