在向量容器

时间:2016-04-20 11:28:51

标签: c++

所以我试图制作蛇克隆。

我制作了一个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变量,使用矢量容器(或其他类型的容器,如果这将有所帮助,不必是矢量)并保持编译器满意?或者我应该彻底改变我的做法?

提前谢谢。

1 个答案:

答案 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;
    }
    ...
};