将数组传递给类函数
Passing array to class function C++
我有一个二维数组,组织为
float vertices[3][3]
在我的程序的一个迭代循环中,我在调试器中看到数组填充如下:
vertices[0] = {-1, -1, 1}
vertices[1] = {-1, -.5, .5}
vertices[2] = {-.5, -1, .5}
然后将三个顶点传递给我的三角形类。
Triangle *t = new Triangle(vertices[0], vertices[1], vertices[2]);
triangles.push_back(*t);
三角形构造函数的编码如下:
Triangle::Triangle(float *a, float *b, float *c)
{
memcpy(v1, a, sizeof(a));
memcpy(v2, b, sizeof(b));
memcpy(v3, c, sizeof(c));
}
调试器现在显示
v1 = {-1, -431602080, -431602080}
v2 = {-1, -431602080, -431602080}
v3 = {-.5, -431602080, -431602080}
调试器还显示,a/b/c只有1个元素长?显然只传递了数组的第一个元素?
sizeof (a)
是
sizeof(浮动*)
不是3x浮点数,它是1个指针。传递额外的参数size_t number_of_members_in_array并替换
memcpy(v1, a, sizeof(a));
memcpy(v1, a, sizeof(*a) *number_of_members_in_array);
Triangle::Triangle(float *a, int numA, float *b, int numB, float *c, int numC)
{
memcpy(v1, a, sizeof(float) * numA);
memcpy(v2, b, sizeof(float) * numB);
memcpy(v3, c, sizeof(float) * numC);
}
这里的问题是您使用sizeof
操作符,因为一旦数组衰减为指针,它就会丢失所有大小信息,并且在函数中执行例如sizeof(a)
只会给您指针的大小而不是它指向的内容。
std::vector
或std::array
来代替。如果您出于某种原因不想使用这些方便的类,那么您需要以某种方式将大小传递给函数,例如作为参数或作为模板形参。
在您的例子中,sizeof(a)
将给您指针的大小,而不是它所指向的数据。这是因为a
是一个float
指针!
这样做:传递元素数量(在您的例子中是3)作为参数:
Triangle::Triangle(float *a, float *b, float *c, int numElements)
{
memcpy(v1, a, sizeof(a) * numElements);
memcpy(v2, b, sizeof(b) * numElements);
memcpy(v3, c, sizeof(c) * numElements);
}
对于预期的固定大小的float数组,有一种替代方法:
Triangle::Triangle(const float (&a)[3], const float (&b)[3], const float (&c)[3])
但传递size
或使用std::array<float, 3>
或std::vector<float>
似乎更简单。
除了其他解决方案之外,我想指出您的代码存在内存泄漏:
Triangle *t = new Triangle(vertices[0], vertices[1], vertices[2]);
triangles.push_back(*t);
当你执行push_back(*t)
时,你是在推入*t
处分配对象的副本,而不是指针t
的副本。vector在内部为另一个Triangle
分配空间,并将给定的对象复制到其中。在此代码之后,该指针丢失,分配的对象被孤立/泄漏。
如果你想保持你的三角形作为单独分配的对象,那么triangles
应该是一个vector<Triangle *>
,代码应该看起来像这样:
Triangle *t = new Triangle(vertices[0], vertices[1], vertices[2]);
triangles.push_back(t);
如果你想保持triangles
作为vector<Triangle>
,那么你需要更像这样的东西:
Triangle t(vertices[0], vertices[1], vertices[2]);
triangles.push_back(t);
或者,如果您的编译器/stl实现支持vector::emplace_back()
,则更简单:
triangles.emplace_back(vertices[0], vertices[1], vertices[2]);
直接对vector中的新项进行构造。
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 正确实现类函数数组
- 如何使用 void 函数从类创建数组
- 为什么我不能使用已删除或私有析构函数分配类的数组?
- 如何在构造函数中的类成员数组中分配数组值,而无需使用STD库
- C 复制构造函数当类具有另一个类的数组时
- 以其他类的数组作为参数公开构造函数
- 删除类的复制构造函数时初始化类的数组成员
- 阻止调用类内数组的默认构造函数
- 为什么在创建类对象数组时不能调用参数化构造函数?
- 当函数 C++ 调用时,类 2D 数组将变为 arr []
- 使用公共函数将对象引用传递到不同的类对象数组中
- 如何为类 C++ 数组调用函数
- 如何为我的类创建数组构造函数
- 使用Swap函数对类对象数组进行排序后出现重复条目-C++
- 如果基类包含数组成员,则派生类的构造函数不能是constexpr
- 在C++中,当我初始化类对象数组时,当我想通过构造函数初始化类成员时,我应该怎么做
- 用C++中的参数在构造函数中定义自己类的数组
- 在另一个类的构造函数中初始化类对象数组
- 指向类函数数组的指针