繁体   English   中英

static const对象不保留值

[英]static const objects are not retaining values

我正在制作一个类似于Minecraft的游戏,其中所有各种块都由一个static const Block <name>; 在.h文件中。 我在.cpp文件中将它们初始化为const Block Block::<name> = Block("name", 0, 0); ,并在构造函数中传递它使用的纹理的索引(表示为unsigned char)。 在构造函数中,它设置索引变量,但是当我尝试稍后在程序中调用它时,它返回一个完全不同的值。

以下是重要部分:

Block::Block(std::string name, uint16 id, uint8 tex)
{
    //Check for repeat ids
    if (IdInUse(id))
    {
        fprintf(stderr, "Block id %u is already in use!", (uint32)id);
        throw std::runtime_error("You cannot reuse block ids!");
    }
    _id = id;
    idMap.insert(std::make_pair(id, *this));
    //Check for repeat names
    if (NameInUse(name))
    {
        fprintf(stderr, "Block name %s is already in use!", name);
        throw std::runtime_error("You cannot reuse block names!");
    }
    _name = name;
    nameMap.insert(std::make_pair(name, *this));

    _tex = tex;
    fprintf(stdout, "Using texture %u\n", _tex);

    _transparent = false;
}

uint8 Block::GetIndex() const
{
    fprintf(stdout, "Returning texture %u\n", _tex);
    return _tex;
}

我将0作为tex传递给构造函数,并在赋值后打印_tex打印出0,所以我知道它在构造函数中正确设置。 但是,当程序稍后调用GetIndex()时,由于某种原因它总是返回204。 我不知道为什么会这样做,但我认为这可能与我宣布所有的块都是static const这一事实有关。 另外,我知道_tex的值没有被改变,因为对象是const并且在初始化之后不会以任何方式操作Block。

如果有人知道可能导致这种情况的原因,我们非常感谢任何帮助。

编辑:

在Block.h中,这是声明块的行,取自class Block

public:
    static const Block Test;

然后在Block.cpp中,这是朝向文件顶部的一行:

const Block Block::Test = Block("Test", 1, 0);

这是block.hblock.cpp的全部内容。

问题是由Block(string,uint16,uint8)构造函数放置在idMapnameMap中的对象是正在构造的对象的副本 - 在初始化_tex之前。

请注意,同样的问题适用于_name成员(至少对于idMap集合)和_transparent成员。

因此,当您从其中一个集合中查找对象时,将检索不完整的副本。

在将对象添加到集合之前,应完全构造对象。 让地图存储指向对象的指针而不是副本也可能更有意义。 如果不打算复制这些Block对象,还应该禁用复制和赋值构造函数。

我看不到idMap的定义,但很明显std::map<uint16, Block> 这意味着它包含您的Block的副本。 当您将构造推入映射时,它通过调用复制构造函数 - > idMap.insert(std::make_pair(id, *this));来创建一个新块idMap.insert(std::make_pair(id, *this));

请注意,这在您设置_tex变量之前发生,因此新副本具有随机_tex值。

您不应该将指针传递给Block。 当Block超出范围并被清理时,这将导致分离错误。

你应该真正了解并使用boost :: flyweight这是你试图在这里使用的模式

有点不清楚你实际上要做什么,因为你没有在这里发布你的代码中足够但关键的部分(特别是Block类的声明)。

你的语句static const Block <name>; 似乎暗示了一个模板声明,其中静态成员实例需要在模板头中定义,而不是在单独的.cpp中定义。 但如果是这样,我不相信你的示例代码会“按原样”编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM