所以我试图制作蛇克隆。
我制作了一个BodyPiece类,它有一些我想成为const的变量,因为它们不应该改变。当我简单地创建一个Bodypiece实例来测试时,这不是问题。但是我希望能够随着蛇的增长添加碎片,所以我制作了一个矢量体变量。从下面的代码中可以看出:
在BodyPiece.h中:
#pragma once
#include "D3DGraphics.h"
#include "Keyboard.h"
#include "Direction.h"
class BodyPiece
{
public:
BodyPiece(int xPos, int yPos, Direction* dir);
~BodyPiece();
void Draw(D3DGraphics& gfx);
void UpdateDirection(KeyboardClient& kbd);
void Move();
private:
Direction* dir;
int xPos;
int yPos;
int width = 5;
int height = 5;
int vx = 5;
int vy = 5;
};
在Game.h文件中
BodyPiece矢量体声明:
std::vector<BodyPiece> body;
在Game.cpp文件中
在初始化列表中初始化的向量。
body({ {400, 300, &d } })
如果我在BodyPiece const中创建任何变量,它将生成错误:
错误C2582'operator ='功能在BodyPiece类中不可用。
我的问题是:
是什么原因造成的?我已经在网上找了一点想法,但它确实只是一点点。
如何使用const变量,使用矢量容器(或其他类型的容器,如果这将有所帮助,不必是矢量)并保持编译器满意?或者我应该彻底改变我的做法?
提前谢谢。
答案 0 :(得分:1)
问题在于,如果你没有赋值操作符,那么编译器会为你生成一个,这会对成员进行简单的浅层复制。但是,如果您有实际的const
成员变量(并且不仅默认初始化为您的),则无法复制这些变量,并且编译器无法创建赋值运算符。
简单的解决方案是使常量实际常量以及static
使它们成为类的成员而不是单个对象的一部分:
class BodyPiece
{
...
static int const width = 5;
static int const height = 5;
};
唯一的缺点是你需要在一个源文件中实际定义这些成员变量:
int const BodyPiece::width;
int const BodyPiece::height;
另一个解决方案是显式创建一个复制所需数据的赋值运算符:
class BodyPiece
{
public:
...
BodyPiece& operator=(BodyPiece const& other)
{
// Copy data from other to this
xPos = other.xPos;
...
return *this;
}
...
};