提问者:小点点

Cpp预定义结构?


上次我用C是在我上大学的时候,所以我不太流利。

我想创建一个小游戏,因为我习惯了C#,所以我想创建预定义的结构对象。

以下是C#代码供参考:

public struct Vector2 : IEquatable<Vector2>
{

  private static readonly Vector2 _zeroVector = new Vector2(0.0f, 0.0f);
  private static readonly Vector2 _unitVector = new Vector2(1f, 1f);
  private static readonly Vector2 _unitXVector = new Vector2(1f, 0.0f);
  private static readonly Vector2 _unitYVector = new Vector2(0.0f, 1f);

  [DataMember]
  public float X;
  [DataMember]
  public float Y;

  public static Vector2 Zero => Vector2._zeroVector;
  public static Vector2 One => Vector2._unitVector;
  public static Vector2 UnitX => Vector2._unitXVector;
  public static Vector2 UnitY => Vector2._unitYVector;

  public Vector2(float x, float y)
  {
    this.X = x;
    this.Y = y;
  }
}

在C#中,我现在可以使用此代码获得x=0和y=0的向量

var postion = Vector2.Zero;

有没有办法在C中创建这样的东西,或者我必须使用c的基本结构并使用这样的结构?

struct Vector2 {
    float x, y;
    Vector2(float x, float y) {
        this->x = x;
        this->y = y;
    }
};

共2个答案

匿名用户

我可能有一个解决办法,但我不确定。

矢量

struct Vector2 {
    static const Vector2 Zero;
    static const Vector2 One;
    float x {}, y {};
}

Vector2.cpp

#include "Vector2.h"

const Vector2 Vector2::Zero = Vector2 {0, 0};
const Vector2 Vector2::One = Vector2 {1, 1};

匿名用户

首先,使用最新版本的C,您可以简化结构定义,如下所示:

struct Vector2 {
    float x{}, y{};
};

这保证了x和y是用0初始化的,您不需要显示单独的构造函数。然后可以像这样使用结构:

Vector2 myVec;  // .x and .y are set to 0
myVec.x = 1; myVec.y = 2;

您甚至可以使用所谓的“初始值设定项列表”来创建具有预定义的x和y值的结构,而不是默认的0,如下所示:

Vector2 myVec2{1,2};

关于您对Vector2结构的“全局”实例的需要,您可以在C中使用与C类似的static关键字:

struct Vector2 {
    float x{}, y{};
    static const Vector2 Zero;
};

与C相反,您不能直接在类中指定常量的值(如果您尝试获得不完整类型错误,因为在编译器遇到常量时,类定义尚未完成);您需要在类之外的某个位置“定义”常量:

const Vector2 Vector2::Zero{};

而上面的结构向量2通常在一个文件中的某个地方。若要将h文件包含在多个其他文件中,则定义应进入a。cpp文件,而不是在标题中,否则您将得到多个定义的符号错误。