尝试创建一个 3D 矢量,该矢量将保留指向指向无符号字符的指针的指针
Trying to create a 3D vector that will hold pointers to a pointers to unsigned char
我试图创建一个向量,该向量将包含指向无符号字符的其他指针的指针。 我的向量定义如下
std::vector<unsigned char**> slices; // data for each slice, in order
//populating vector
unsigned char a = 1;
for (int k = 0; k < size; k++)
{
unsigned char ** tempSlice = new unsigned char*;
slices.push_back(tempSlice);
for (int y = 0; y < height; y++)
{
unsigned char * tempY = new unsigned char;
slices[k].push_back(&tempY);
for (int x = 0; x < width; x++)
{
slices[k][y][x] = a;
}
}
}
但是,我得到的错误是以下几行:
error request for member ‘push_back’ in ‘((VolImage*)this)-
>VolImage::slices.std::vector<_Tp, _Alloc>::operator[]<unsigned char**,
std::allocator<unsigned char**> >(((std::vector<unsigned
char**>::size_type)k))’, which is of non-class type
‘__gnu_cxx::__alloc_traits<std::allocator<unsigned char**> >::value_type
{aka unsigned
我不知道我做错了什么。另外,如果有人可以看看我的析构函数方法,看看我是否在正确的轨道上:
VolImage::~VolImage()
{
std::cout<<"Destructor"<<std::endl;
//deconstructing the vector of slices
int size = slices.size();
for (int k = 0; k < size; k++)
{
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
delete &slices[k][y][x];
}
delete[] slices[k][y];
}
delete[] slices[k];
}
delete[] &slices;
}
您在这里已经有一个错误:
slices[k].push_back(&tempY);
这是由错误消息解释的,但人们普遍认为 gcc 的 C++ 错误消息并不是最容易解析的。
"((VolImage*)this)中成员"push_back"的错误请求-
VolImage::slices.std::vector<_Tp, _Alloc>::operator[]>(((std::vector::size_type)k))',属于非类类型 'a__gnu_cxx::__alloc_traits>::value_type {又名无符号
这告诉你你正在请求一个成员函数~push_back~(大复杂的结构),它是非类类型的(更难解析的东西){aka unsigned char*}
还有一个问题:slices[k] 给你一个 ~unsigned char*~ 的引用,而 char ptrs 没有成员函数push_back。
查看代码的其余部分,看起来您想要一个 char** 的二维数组。 实现此目的的一种方法是向量向量:
std::vector<std::vector<char**>> slices;
这将为你提供一个二维向量,并允许你的第二个push_back成功,但会导致你的第一个push_back失败,因为你将尝试将字符**推入容器容器中。 稍后您将再次失败,因为您将二维向量视为三维向量。
如果你不介意一点指导,你试图一次跳过太多的抽象级别。 首先尝试char*的向量,然后可能是char**的向量,然后可能将其制作成3D向量。 这样,您一次只需要处理一类错误(概念错误和编译器错误)。
这将是一个有用的练习,因为您将更好地了解C++中的指针和向量。 完成学习过程后,您可能会找到更适合此目的的其他容器。 例如提升multi_array
从您的评论
我知道你打算使用字符**的向量作为 3D 数组...... 所以在这种情况下,char** 必须被理解为一个二维字符数组......有关说明,请参阅此处。 然后你制作这些二维数组的向量 - 下面是一个例子:
int main() {
std::vector<unsigned char**> slices; // data for each slice, in order
const unsigned int size =5;
const unsigned int rows =2;
const unsigned int cols =3;
for (int k = 0; k < size; k++)
{
unsigned char** twoD = new unsigned char*[rows];
for(int i = 0; i < rows; ++i)
twoD[i] = new unsigned char[cols];
slices.push_back(twoD);
}
slices[0][0][0] = 'x';
std::cout << slices[0][0][0] << std::endl;
}
向量的类型必须是 void* 类型,然后在重用该指针时需要类型转换为 char** 或 char* 或其他任何内容。
- 指针保留字符串
- 保留函数指针模板参数
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 保留计时器集合(对象与指针)的最佳方法
- 更改保留指向其字段的原始指针的对象地址
- 释放指向保留嵌套变量内存地址的结构的指针
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 如何在字符指针数组中保留指向每个单词的指针?
- 指向结构的指针保留某些属性,同时将其他属性重置为零(使用 map)
- 即使阵列腐烂到指针,如何将函数的参数保留为数组,这很好
- clock_nanosleep - 请求和保留的相同指针
- 如何在不覆盖C 中保留指针的价值
- 无法保留指向内存的指针
- 结构中的C++数组指针保留内存位置,但丢失所有值
- 删除动态数组,但保留指针
- 如何在参数中传递双重指针,以保留值
- C++:为指向两种类型之一的指针保留打开选项
- 返回类型,或如何保留对象指针的类型
- 保留存储在STL容器中的指针所指向的值(unordered_map)
- 非NULL保留指针值