结构指针的 C++ 数组

c++ array of struct pointers

本文关键字:数组 C++ 指针 结构      更新时间:2023-10-16

我想定义结构指针的动态数组我有 box2d 结构

struct b2Vec2
{
    /// Default constructor does nothing (for performance).
    b2Vec2() {}
    /// Construct using coordinates.
    b2Vec2(float32 x, float32 y) : x(x), y(y) {}
    /// Set this vector to all zeros.
    void SetZero() { x = 0.0f; y = 0.0f; }
    /// Set this vector to some specified coordinates.
    void Set(float32 x_, float32 y_) { x = x_; y = y_; }
    /// Negate this vector.
    b2Vec2 operator -() const { b2Vec2 v; v.Set(-x, -y); return v; }
    /// Read from and indexed element.
    float32 operator () (int32 i) const
    {
        return (&x)[i];
    }
    /// Write to an indexed element.
    float32& operator () (int32 i)
    {
        return (&x)[i];
    }
    /// Add a vector to this vector.
    void operator += (const b2Vec2& v)
    {
        x += v.x; y += v.y;
    }
    /// Subtract a vector from this vector.
    void operator -= (const b2Vec2& v)
    {
        x -= v.x; y -= v.y;
    }
    /// Multiply this vector by a scalar.
    void operator *= (float32 a)
    {
        x *= a; y *= a;
    }
    /// Get the length of this vector (the norm).
    float32 Length() const
    {
        return b2Sqrt(x * x + y * y);
    }
    /// Get the length squared. For performance, use this instead of
    /// b2Vec2::Length (if possible).
    float32 LengthSquared() const
    {
        return x * x + y * y;
    }
    /// Convert this vector into a unit vector. Returns the length.
    float32 Normalize()
    {
        float32 length = Length();
        if (length < b2_epsilon)
        {
            return 0.0f;
        }
        float32 invLength = 1.0f / length;
        x *= invLength;
        y *= invLength;
        return length;
    }
    /// Does this vector contain finite coordinates?
    bool IsValid() const
    {
        return b2IsValid(x) && b2IsValid(y);
    }
    /// Get the skew vector such that dot(skew_vec, other) == cross(vec, other)
    b2Vec2 Skew() const
    {
        return b2Vec2(-y, x);
    }
    float32 x, y;
};

在 C++ 文件中,我想定义 b2Vec2 的数组当我尝试使用新的 b2Vec2 结构设置数组时,我收到错误:

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'b2Vec2 *' (or there is no acceptable conversion)   

b2Vec2 *vertices = new b2Vec2[buffer.size()]; // its int number > 0
int verticeslength = polygon->buffer.size();
for (int ii=0, nn=verticeslength; ii<nn; ii++) {
    vertices[ii] = new b2Vec2(); // This is where the error .
}

我做错了什么?

你错过了两个*

b2Vec2 **vertices = new b2Vec2*[buffer.size()];
       ^                      ^

但是,最好使用std::vector而不是基础指针。

std::size_t N = buffer.size();
std::vector<std::vector<b2Vec2>> vertices (N, std::vector<b2Vec2>(N));

您也可以尝试根本不将它们分配为指针,而是使用 std::vector 之类的东西来执行此操作:

#include <vector>
using namespace std;
...
{ 
   vector<b2Vec2> vertices;
   vertices.resize(buffer.size());
   // Use the vertices.
   for(int idx = 0; idx < vertices.size(); idx++)
   {  // Do something with each vertex
   }
}

我建议这样做的唯一原因是动态创建指针和数组通常会导致内存泄漏、睡眠不足等。

如果您需要退回它们,可以将其退回。 它也可以是封闭类的成员,由函数传入和初始化。 您可以通过将任何元素作为顶点[idx]访问来更改它。 您不必担心内存泄漏...您没有对其调用 new,因此不必对其调用 delete。