上次我用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;
}
};
我可能有一个解决办法,但我不确定。
矢量
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文件,而不是在标题中,否则您将得到多个定义的符号错误。