如何在一个命名空间中初始化所有变量 class

How to initialize all variables from a namespace in one class

我正在使用 SFML 制作一个小游戏。 我想在游戏启动时一次性加载我的所有资源,这样每次创建新实体时都不需要将新资源加载到内存中从而降低游戏速度。

我为我需要的每种资源制作了一个带有命名空间的头文件:

#pragma once

#include <SFML/Graphics.hpp>

#include <iostream>

#include "spritesheet.h"

namespace PlayerSprite {
    extern Spritesheet playerSpritesheet;
    extern sf::Sprite sp1, sp2, sp3, sp4, sp5, sp6;
    extern int width = 16;
    extern int height = 16;
}

namespace ButtonSprite {
    extern Spritesheet buttonSpritesheet;
    extern sf::Sprite button;
    extern int width = 32;
    extern int height = 16;
}

class Resources {
    public:
        Resources() = default;
        void loadResources();
};

现在我对名称空间了解不多,只了解非常基本的东西,这是使用名称空间的第一个原因。

现在在 cpp 文件中:

#include <iostream>

#include "../headers/resources.h"

void Resources::loadResources() {
    // PLAYER
    PlayerSprite::playerSpritesheet.setSprite("./res/img/tiles.png");
    PlayerSprite::sp1 = PlayerSprite::playerSpritesheet.getSprite(0, 0, PlayerSprite::width, 
    PlayerSprite::height);
    PlayerSprite::sp2 = PlayerSprite::playerSpritesheet.getSprite(32, 0, PlayerSprite::width, 
    PlayerSprite::height);
    PlayerSprite::sp3 = PlayerSprite::playerSpritesheet.getSprite(48, 0, PlayerSprite::width, 
    PlayerSprite::height);
    PlayerSprite::sp4 = PlayerSprite::playerSpritesheet.getSprite(64, 0, PlayerSprite::width, 
    PlayerSprite::height);
    PlayerSprite::sp5 = PlayerSprite::playerSpritesheet.getSprite(80, 0, PlayerSprite::width, 
    PlayerSprite::height);
    PlayerSprite::sp6 = PlayerSprite::playerSpritesheet.getSprite(0, 16, PlayerSprite::width, 
    PlayerSprite::height);
    // PLAYER

    // BUTTONS
    ButtonSprite::buttonSpritesheet.setSprite("./res/img/tiles.png");
    ButtonSprite::button = ButtonSprite::buttonSpritesheet.getSprite(48, 16, 32, 16);
    // BUTTONS
}

然后我在主游戏文件中调用这个函数,但是当我 运行 我在播放器中得到这个错误 class:

undefined reference to 'PlayerSprite:sp1'

不知道是命名空间声明的问题,还是我系统代码写错了


在查看了有关此问题的一些评论后,我添加了以下内容:

void Resources::allocateStorage() {
    sf::Sprite PlayerSprite::spritesheet;
    sf::Sprite PlayerSprite::sp1;
}

在 cpp 文件中,但我现在收到此错误:

unqualified-id in declaration before ';' token 在函数执行后的第 1 行。

问题似乎是变量实际上并没有在任何地方定义,只是声明了。当使用extern时,编译器会假设这个变量存在,所以编译器可以继续假设这个变量存在。然后链接器将进入,并查看哪里那个变量存在。如果没有,您将收到未定义的引用错误。要解决此问题,您需要在某处定义变量。

例如,在 resources.cpp 中,您将有:

#include "../headers/resources.h"

sf::Sprite PlayerSpriter::sp1;
sf::Sprite PlayerSpriter::sp2;
sf::Sprite PlayerSpriter::sp3;
// etc...


void Resources::loadResources() { 
    // …
}

这是您 header 中已有内容的补充。

注意:根据您的编辑,这会发生在任何函数之外。