gpt4 book ai didi

c++ - 如何从一个类中的命名空间初始化所有变量

转载 作者:行者123 更新时间:2023-12-04 16:58:49 25 4
gpt4 key购买 nike

我正在使用 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
}

然后我在主游戏文件中调用这个函数,但是当我运行时,我在播放器类中得到这个错误:
undefined reference to 'PlayerSprite:sp1'
我不知道这是因为命名空间声明,还是我对系统的编码错误。

在查看了有关此问题的一些评论后,我添加了以下内容:
void Resources::allocateStorage() {
sf::Sprite PlayerSprite::spritesheet;
sf::Sprite PlayerSprite::sp1;
}

在 cpp 文件中,但我现在收到此错误:
unqualified-id in declaration before ';' token在函数执行后的第一行。

最佳答案

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

例如,在说 resources.cpp , 你将会拥有:

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

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


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

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

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

关于c++ - 如何从一个类中的命名空间初始化所有变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61104641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com