c+中的struct的恼人问题+; 我的问题是我不知道如何在C++中编程东西,就像我在C语言中那样。所以我不知道我的代码有什么问题。 我正在尝试创建两个结构。一个表示矩阵X33,另一个表示向量2D: struct Vector2 { float x; float y; float h; Vector2() { x = y = h = 0; } Vector2(float valueX, float valueY, float valueH) { x = valueX; y = valueY; h = valueH; } Vector2(float valueX, float valueY) { x = valueX; y = valueY; h = 1; } Vector2 Translate(Vector2 dir) { Matrix33 matrix = Matrix33::GetIdentity(); matrix.a02 = dir.x; matrix.a12 = dir.y; return matrix * Vector2(x, y, h); } static Vector2 VectorOne() { return Vector2(1, 1, 1); } static Vector2 VectorUP() { return Vector2(0, 1, 0); } static Vector2 VectorFoward() { return Vector2(0, 0, 1); } static Vector2 VectorRight() { return Vector2(1, 0, 0); } Vector2 operator*(const int value) { return Vector2(x*value, y*value, h); } Vector2 operator/(const int value) { return Vector2(x / value, y / value, 1); } Vector2 operator+(const Vector2 value) { return Vector2(x + value.x, y + value.y); } Vector2 operator-(const Vector2 value) { return Vector2(x - value.x, y - value.y); } }; struct Matrix33 { float a00; float a01; float a02; float a10; float a11; float a12; float a20; float a21; float a22; Matrix33() { a00 = a01 = a02 = a10 = a11 = a12 = a20 = a21 = a22 = 0; } void AddValues(int line, float c1, float c2, float c3) { if (line == 0) { a00 = c1; a01 = c2; a02 = c3; } else if (line == 1) { a10 = c1; a11 = c2; a12 = c3; } else if (line == 2) { a20 = c1; a21 = c2; a20 = c3; } } static Matrix33 GetIdentity() { Matrix33 m; m.a00 = m.a11 = m.a22 = 1; return m; } Matrix33 operator*(const Matrix33 m) { Matrix33 result; result.AddValues(0, (a00*m.a00 + a01*m.a10 + a02*m.a20), (a00*m.a01 + a01*m.a11 + a02*m.a21), (a00*m.a02 + a01*m.a12 + a02*m.a22)); result.AddValues(1, (a10*m.a00 + a11*m.a10 + a12*m.a20), (a10*m.a01 + a11*m.a11 + a12*m.a21), (a10*m.a02 + a11*m.a12 + a12*m.a22)); result.AddValues(2, (a20*m.a00 + a21*m.a10 + a22*m.a20), (a20*m.a01 + a21*m.a11 + a22*m.a21), (a20*m.a02 + a21*m.a12 + a22*m.a22)); return result; } Vector2 operator*(const Vector2 p) { Vector2 result; result.x = a00*p.x + a01*p.y + a02*p.h; result.y = a10*p.x + a11*p.y + a12*p.h; result.h = a20*p.x + a21*p.y + a22*p.h; return result; } };

c+中的struct的恼人问题+; 我的问题是我不知道如何在C++中编程东西,就像我在C语言中那样。所以我不知道我的代码有什么问题。 我正在尝试创建两个结构。一个表示矩阵X33,另一个表示向量2D: struct Vector2 { float x; float y; float h; Vector2() { x = y = h = 0; } Vector2(float valueX, float valueY, float valueH) { x = valueX; y = valueY; h = valueH; } Vector2(float valueX, float valueY) { x = valueX; y = valueY; h = 1; } Vector2 Translate(Vector2 dir) { Matrix33 matrix = Matrix33::GetIdentity(); matrix.a02 = dir.x; matrix.a12 = dir.y; return matrix * Vector2(x, y, h); } static Vector2 VectorOne() { return Vector2(1, 1, 1); } static Vector2 VectorUP() { return Vector2(0, 1, 0); } static Vector2 VectorFoward() { return Vector2(0, 0, 1); } static Vector2 VectorRight() { return Vector2(1, 0, 0); } Vector2 operator*(const int value) { return Vector2(x*value, y*value, h); } Vector2 operator/(const int value) { return Vector2(x / value, y / value, 1); } Vector2 operator+(const Vector2 value) { return Vector2(x + value.x, y + value.y); } Vector2 operator-(const Vector2 value) { return Vector2(x - value.x, y - value.y); } }; struct Matrix33 { float a00; float a01; float a02; float a10; float a11; float a12; float a20; float a21; float a22; Matrix33() { a00 = a01 = a02 = a10 = a11 = a12 = a20 = a21 = a22 = 0; } void AddValues(int line, float c1, float c2, float c3) { if (line == 0) { a00 = c1; a01 = c2; a02 = c3; } else if (line == 1) { a10 = c1; a11 = c2; a12 = c3; } else if (line == 2) { a20 = c1; a21 = c2; a20 = c3; } } static Matrix33 GetIdentity() { Matrix33 m; m.a00 = m.a11 = m.a22 = 1; return m; } Matrix33 operator*(const Matrix33 m) { Matrix33 result; result.AddValues(0, (a00*m.a00 + a01*m.a10 + a02*m.a20), (a00*m.a01 + a01*m.a11 + a02*m.a21), (a00*m.a02 + a01*m.a12 + a02*m.a22)); result.AddValues(1, (a10*m.a00 + a11*m.a10 + a12*m.a20), (a10*m.a01 + a11*m.a11 + a12*m.a21), (a10*m.a02 + a11*m.a12 + a12*m.a22)); result.AddValues(2, (a20*m.a00 + a21*m.a10 + a22*m.a20), (a20*m.a01 + a21*m.a11 + a22*m.a21), (a20*m.a02 + a21*m.a12 + a22*m.a22)); return result; } Vector2 operator*(const Vector2 p) { Vector2 result; result.x = a00*p.x + a01*p.y + a02*p.h; result.y = a10*p.x + a11*p.y + a12*p.h; result.h = a20*p.x + a21*p.y + a22*p.h; return result; } };,c++,visual-c++,struct,compiler-errors,C++,Visual C++,Struct,Compiler Errors,问题是,当我尝试构建时,我得到了很多与my matrix aN值和静态函数GetIdentity()相关的错误。我不知道这里发生了什么事 错误7错误C2228:“.a12”的左侧必须具有类/结构/联合 错误16错误C2228:“.a12”的左侧必须具有类/结构/联合 错误27错误C2228:“.a12”的左侧必须具有类/结构/联合 错误5错误C2228:“.a02”的左侧必须具有类/结构/联合 错误14错误C2228:“.a02”的左侧必须具有类/结构/联合 错误25错误C2228:“.a02”

问题是,当我尝试构建时,我得到了很多与my matrix aN值和静态函数GetIdentity()相关的错误。我不知道这里发生了什么事

错误7错误C2228:“.a12”的左侧必须具有类/结构/联合
错误16错误C2228:“.a12”的左侧必须具有类/结构/联合 错误27错误C2228:“.a12”的左侧必须具有类/结构/联合
错误5错误C2228:“.a02”的左侧必须具有类/结构/联合
错误14错误C2228:“.a02”的左侧必须具有类/结构/联合
错误25错误C2228:“.a02”的左侧必须具有类/结构/联合

错误5错误C3861:“GetIdentity”:找不到标识符
错误16错误C3861:“GetIdentity”:找不到标识符
错误29错误C3861:“GetIdentity”:找不到标识符
错误4错误C2653:“Matrix33”:不是类或命名空间名称
错误15错误C2653:“Matrix33”:不是类或命名空间名称
错误28错误C2653:“Matrix33”:不是类或命名空间名称

有人有什么建议可以帮我吗。我将不胜感激!。
谢谢

在定义处理Matrix3类元素的Vector2类的任何成员函数之前,必须先定义Matrix3类。只有在定义了Matrix3之后,才能定义Vector2类的这些成员函数

比如说

struct Vector2
{
    float x;
    float y;
    float h;

    Vector2()
    {
        x = y = h = 0;
    }
    Vector2(float valueX, float valueY, float valueH)
    {
        x = valueX;
        y = valueY;
        h = valueH;

    }
    Vector2(float valueX, float valueY)
    {
        x = valueX;
        y = valueY;
        h = 1;
    }

    // not defined but only declared    
    Vector2 Translate(Vector2 dir);

    // other members of the class
};


struct Matrix33
{
    float a00; float a01; float a02;
    float a10; float a11; float a12;
    float a20; float a21; float a22;

    Matrix33()
    {
        a00 = a01 = a02 = a10 = a11 = a12 = a20 = a21 = a22 = 0;
    }
    void AddValues(int line, float c1, float c2, float c3)
    {
        if (line == 0)
        {
            a00 = c1;
            a01 = c2;
            a02 = c3;
        }
        else if (line == 1)
        {
            a10 = c1;
            a11 = c2;
            a12 = c3;
        }
        else if (line == 2)
        {
            a20 = c1;
            a21 = c2;
            a20 = c3;
        }
    }

    static Matrix33 GetIdentity()
    {
        Matrix33 m;
        m.a00 = m.a11 = m.a22 = 1;

        return m;
    }

    Matrix33 operator*(const Matrix33 m)
    {
        Matrix33 result;
        result.AddValues(0, (a00*m.a00 + a01*m.a10 + a02*m.a20), (a00*m.a01 + a01*m.a11 + a02*m.a21), (a00*m.a02 + a01*m.a12 + a02*m.a22));
        result.AddValues(1, (a10*m.a00 + a11*m.a10 + a12*m.a20), (a10*m.a01 + a11*m.a11 + a12*m.a21), (a10*m.a02 + a11*m.a12 + a12*m.a22));
        result.AddValues(2, (a20*m.a00 + a21*m.a10 + a22*m.a20), (a20*m.a01 + a21*m.a11 + a22*m.a21), (a20*m.a02 + a21*m.a12 + a22*m.a22));

        return result;
    }
    Vector2 operator*(const Vector2 p)
    {
        Vector2 result;

        result.x = a00*p.x + a01*p.y + a02*p.h;
        result.y = a10*p.x + a11*p.y + a12*p.h;
        result.h = a20*p.x + a21*p.y + a22*p.h;

        return result;
    }

};

// now you may define it
Vector2 Vector2::Translate(Vector2 dir)
{
    Matrix33 matrix = Matrix33::GetIdentity();

    matrix.a02 = dir.x;
    matrix.a12 = dir.y;

    return matrix * Vector2(x, y, h);
}

在定义处理Matrix3类元素的Vector2类的任何成员函数之前,必须定义Matrix3类。只有在定义了Matrix3之后,才能定义Vector2类的这些成员函数

比如说

struct Vector2
{
    float x;
    float y;
    float h;

    Vector2()
    {
        x = y = h = 0;
    }
    Vector2(float valueX, float valueY, float valueH)
    {
        x = valueX;
        y = valueY;
        h = valueH;

    }
    Vector2(float valueX, float valueY)
    {
        x = valueX;
        y = valueY;
        h = 1;
    }

    // not defined but only declared    
    Vector2 Translate(Vector2 dir);

    // other members of the class
};


struct Matrix33
{
    float a00; float a01; float a02;
    float a10; float a11; float a12;
    float a20; float a21; float a22;

    Matrix33()
    {
        a00 = a01 = a02 = a10 = a11 = a12 = a20 = a21 = a22 = 0;
    }
    void AddValues(int line, float c1, float c2, float c3)
    {
        if (line == 0)
        {
            a00 = c1;
            a01 = c2;
            a02 = c3;
        }
        else if (line == 1)
        {
            a10 = c1;
            a11 = c2;
            a12 = c3;
        }
        else if (line == 2)
        {
            a20 = c1;
            a21 = c2;
            a20 = c3;
        }
    }

    static Matrix33 GetIdentity()
    {
        Matrix33 m;
        m.a00 = m.a11 = m.a22 = 1;

        return m;
    }

    Matrix33 operator*(const Matrix33 m)
    {
        Matrix33 result;
        result.AddValues(0, (a00*m.a00 + a01*m.a10 + a02*m.a20), (a00*m.a01 + a01*m.a11 + a02*m.a21), (a00*m.a02 + a01*m.a12 + a02*m.a22));
        result.AddValues(1, (a10*m.a00 + a11*m.a10 + a12*m.a20), (a10*m.a01 + a11*m.a11 + a12*m.a21), (a10*m.a02 + a11*m.a12 + a12*m.a22));
        result.AddValues(2, (a20*m.a00 + a21*m.a10 + a22*m.a20), (a20*m.a01 + a21*m.a11 + a22*m.a21), (a20*m.a02 + a21*m.a12 + a22*m.a22));

        return result;
    }
    Vector2 operator*(const Vector2 p)
    {
        Vector2 result;

        result.x = a00*p.x + a01*p.y + a02*p.h;
        result.y = a10*p.x + a11*p.y + a12*p.h;
        result.h = a20*p.x + a21*p.y + a22*p.h;

        return result;
    }

};

// now you may define it
Vector2 Vector2::Translate(Vector2 dir)
{
    Matrix33 matrix = Matrix33::GetIdentity();

    matrix.a02 = dir.x;
    matrix.a12 = dir.y;

    return matrix * Vector2(x, y, h);
}

在定义处理Matrix3类元素的Vector2类的任何成员函数之前,必须定义Matrix3类。只有在定义了Matrix3之后,才能定义Vector2类的这些成员函数

比如说

struct Vector2
{
    float x;
    float y;
    float h;

    Vector2()
    {
        x = y = h = 0;
    }
    Vector2(float valueX, float valueY, float valueH)
    {
        x = valueX;
        y = valueY;
        h = valueH;

    }
    Vector2(float valueX, float valueY)
    {
        x = valueX;
        y = valueY;
        h = 1;
    }

    // not defined but only declared    
    Vector2 Translate(Vector2 dir);

    // other members of the class
};


struct Matrix33
{
    float a00; float a01; float a02;
    float a10; float a11; float a12;
    float a20; float a21; float a22;

    Matrix33()
    {
        a00 = a01 = a02 = a10 = a11 = a12 = a20 = a21 = a22 = 0;
    }
    void AddValues(int line, float c1, float c2, float c3)
    {
        if (line == 0)
        {
            a00 = c1;
            a01 = c2;
            a02 = c3;
        }
        else if (line == 1)
        {
            a10 = c1;
            a11 = c2;
            a12 = c3;
        }
        else if (line == 2)
        {
            a20 = c1;
            a21 = c2;
            a20 = c3;
        }
    }

    static Matrix33 GetIdentity()
    {
        Matrix33 m;
        m.a00 = m.a11 = m.a22 = 1;

        return m;
    }

    Matrix33 operator*(const Matrix33 m)
    {
        Matrix33 result;
        result.AddValues(0, (a00*m.a00 + a01*m.a10 + a02*m.a20), (a00*m.a01 + a01*m.a11 + a02*m.a21), (a00*m.a02 + a01*m.a12 + a02*m.a22));
        result.AddValues(1, (a10*m.a00 + a11*m.a10 + a12*m.a20), (a10*m.a01 + a11*m.a11 + a12*m.a21), (a10*m.a02 + a11*m.a12 + a12*m.a22));
        result.AddValues(2, (a20*m.a00 + a21*m.a10 + a22*m.a20), (a20*m.a01 + a21*m.a11 + a22*m.a21), (a20*m.a02 + a21*m.a12 + a22*m.a22));

        return result;
    }
    Vector2 operator*(const Vector2 p)
    {
        Vector2 result;

        result.x = a00*p.x + a01*p.y + a02*p.h;
        result.y = a10*p.x + a11*p.y + a12*p.h;
        result.h = a20*p.x + a21*p.y + a22*p.h;

        return result;
    }

};

// now you may define it
Vector2 Vector2::Translate(Vector2 dir)
{
    Matrix33 matrix = Matrix33::GetIdentity();

    matrix.a02 = dir.x;
    matrix.a12 = dir.y;

    return matrix * Vector2(x, y, h);
}

在定义处理Matrix3类元素的Vector2类的任何成员函数之前,必须定义Matrix3类。只有在定义了Matrix3之后,才能定义Vector2类的这些成员函数

比如说

struct Vector2
{
    float x;
    float y;
    float h;

    Vector2()
    {
        x = y = h = 0;
    }
    Vector2(float valueX, float valueY, float valueH)
    {
        x = valueX;
        y = valueY;
        h = valueH;

    }
    Vector2(float valueX, float valueY)
    {
        x = valueX;
        y = valueY;
        h = 1;
    }

    // not defined but only declared    
    Vector2 Translate(Vector2 dir);

    // other members of the class
};


struct Matrix33
{
    float a00; float a01; float a02;
    float a10; float a11; float a12;
    float a20; float a21; float a22;

    Matrix33()
    {
        a00 = a01 = a02 = a10 = a11 = a12 = a20 = a21 = a22 = 0;
    }
    void AddValues(int line, float c1, float c2, float c3)
    {
        if (line == 0)
        {
            a00 = c1;
            a01 = c2;
            a02 = c3;
        }
        else if (line == 1)
        {
            a10 = c1;
            a11 = c2;
            a12 = c3;
        }
        else if (line == 2)
        {
            a20 = c1;
            a21 = c2;
            a20 = c3;
        }
    }

    static Matrix33 GetIdentity()
    {
        Matrix33 m;
        m.a00 = m.a11 = m.a22 = 1;

        return m;
    }

    Matrix33 operator*(const Matrix33 m)
    {
        Matrix33 result;
        result.AddValues(0, (a00*m.a00 + a01*m.a10 + a02*m.a20), (a00*m.a01 + a01*m.a11 + a02*m.a21), (a00*m.a02 + a01*m.a12 + a02*m.a22));
        result.AddValues(1, (a10*m.a00 + a11*m.a10 + a12*m.a20), (a10*m.a01 + a11*m.a11 + a12*m.a21), (a10*m.a02 + a11*m.a12 + a12*m.a22));
        result.AddValues(2, (a20*m.a00 + a21*m.a10 + a22*m.a20), (a20*m.a01 + a21*m.a11 + a22*m.a21), (a20*m.a02 + a21*m.a12 + a22*m.a22));

        return result;
    }
    Vector2 operator*(const Vector2 p)
    {
        Vector2 result;

        result.x = a00*p.x + a01*p.y + a02*p.h;
        result.y = a10*p.x + a11*p.y + a12*p.h;
        result.h = a20*p.x + a21*p.y + a22*p.h;

        return result;
    }

};

// now you may define it
Vector2 Vector2::Translate(Vector2 dir)
{
    Matrix33 matrix = Matrix33::GetIdentity();

    matrix.a02 = dir.x;
    matrix.a12 = dir.y;

    return matrix * Vector2(x, y, h);
}

实际上你不需要做很多改变。您可以向前声明
Vector2
,将
Vector2
的定义移动到
Matrix33
之后,然后将
运算符*
的定义移动到
Matrix33
之外。例如:

// Forward declaration
struct Vector2;

struct Matrix33
{
  // ...    
  Vector2 operator*(const Vector2 p); 
  // ^ declaration only because
  //   Vector2 is an incomplete type at this point
};

struct Vector2
{
 // ...
};

Vector2 Matrix33::operator*(const Vector2 p)
{
  Vector2 result;

  result.x = a00*p.x + a01*p.y + a02*p.h;
  result.y = a10*p.x + a11*p.y + a12*p.h;
  result.h = a20*p.x + a21*p.y + a22*p.h;

  return result;
}

实际上,您不必做很多更改。您可以向前声明
Vector2
,将
Vector2
的定义移动到
Matrix33
之后,然后将
运算符*
的定义移动到
Matrix33
之外。例如:

// Forward declaration
struct Vector2;

struct Matrix33
{
  // ...    
  Vector2 operator*(const Vector2 p); 
  // ^ declaration only because
  //   Vector2 is an incomplete type at this point
};

struct Vector2
{
 // ...
};

Vector2 Matrix33::operator*(const Vector2 p)
{
  Vector2 result;

  result.x = a00*p.x + a01*p.y + a02*p.h;
  result.y = a10*p.x + a11*p.y + a12*p.h;
  result.h = a20*p.x + a21*p.y + a22*p.h;

  return result;
}

实际上,您不必做很多更改。您可以向前声明
Vector2
,将
Vector2
的定义移动到
Matrix33
之后,然后将
运算符*
的定义移动到
Matrix33
之外。例如:

// Forward declaration
struct Vector2;

struct Matrix33
{
  // ...    
  Vector2 operator*(const Vector2 p); 
  // ^ declaration only because
  //   Vector2 is an incomplete type at this point
};

struct Vector2
{
 // ...
};

Vector2 Matrix33::operator*(const Vector2 p)
{
  Vector2 result;

  result.x = a00*p.x + a01*p.y + a02*p.h;
  result.y = a10*p.x + a11*p.y + a12*p.h;
  result.h = a20*p.x + a21*p.y + a22*p.h;

  return result;
}

实际上,您不必做很多更改。您可以向前声明
Vector2
,将
Vector2
的定义移动到
Matrix33
之后,然后将
运算符*
的定义移动到
Matrix33
之外。例如:

// Forward declaration
struct Vector2;

struct Matrix33
{
  // ...    
  Vector2 operator*(const Vector2 p); 
  // ^ declaration only because
  //   Vector2 is an incomplete type at this point
};

struct Vector2
{
 // ...
};

Vector2 Matrix33::operator*(const Vector2 p)
{
  Vector2 result;

  result.x = a00*p.x + a01*p.y + a02*p.h;
  result.y = a10*p.x + a11*p.y + a12*p.h;
  result.h = a20*p.x + a21*p.y + a22*p.h;

  return result;
}


“我的问题是,我不知道如何在C++中像C++那样编程东西。”你不应该是完全不同的语言。我认为至少结构上的东西是相似的。VoCTR2不知道MatLX33类,你需要在矢量2之前声明或定义MatRX33。我建议C++教程开始。 <代码>结构> <代码>在C++中是相同的,除了默认的<代码>类< /C>成员是默认的。人们会给你解决方案,但这不会解决根本原因,你需要学习C++基础知识:“我的问题是我不知道如何在C++中像C++那样编程东西。”你不应该认为它们是完全不同的语言。我想至少结构的东西是相似的。Vector2不知道Matrix33类,你需要在Vector2之前向前声明或定义Matrix33。我建议C++教程开始。 <代码>结构> <代码>在C++中是相同的,除了默认的<代码>类< /C>成员是默认的。人们会给你解决方案,但这不会解决根本原因,你需要学习C++基础知识:“我的问题是我不知道如何在C++中像C++那样编程东西。”你不应该认为它们是完全不同的语言。我想至少结构的东西是相似的。Vector2不知道Matrix33类,你需要在Vector2之前向前声明或定义Matrix33。我建议C++教程开始。 <代码>结构> <代码>在C++中是相同的,除了默认的<代码>类< /C>成员是默认的。人们会给你解决方案,但这不会解决根本原因,你需要学习C++基础知识:“我的问题是我不知道如何在C++中像C++那样编程东西。”你不应该认为它们是完全不同的语言。我想至少结构的东西是相似的。Vector2不知道Matrix33类,你需要在Vector2之前向前声明或定义Matrix33。我建议C++教程开始。< C++ >代码>结构> <代码>,除了 >类< /Cuth>默认情况下,成员是私有的。人们将给出解决方案,但这不会修复根本原因,你需要学习C++ Basic Studio,最后一行你建议的矢量2 Matrx33::操作符*(const VECURT2 P)将获取我的a00、a01等值吗?因为代码在