簡體   English   中英

如何在一個 class 中初始化命名空間中的所有變量

[英]How to initialize all variables from a namespace in one class

我正在使用 SFML 制作一個小游戲。 我想在游戲啟動時將所有資源加載到一個 go 中,因此每次創建新實體時都不需要將新資源加載到 memory 中,從而減慢游戲速度。

我制作了一個 header 文件,其中包含我需要的每種資源的命名空間:

#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
}

然后我在主游戲文件中調用此 function,但是當我運行時,我在播放器 class 中收到此錯誤:

undefined reference to 'PlayerSprite:sp1'

我不知道這是因為命名空間聲明,還是我對系統的編碼錯誤。


在查看了有關此問題的一些評論后,我添加了以下內容:

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

在 cpp 文件中,但我現在收到此錯誤:

unqualified-id in declaration before ';' token 執行 function 后的第 1 行unqualified-id in declaration before ';' token

問題似乎是變量實際上並沒有在任何地方定義,只是聲明了。 使用extern時,編譯器將假定該變量存在,因此編譯器可以繼續假定該變量存在。 然后 linker 將進入,並查看該變量存在的位置 如果沒有,您會收到未定義的引用錯誤。 要解決此問題,您需要在某處定義變量。

例如,在說resources.cpp中,您將擁有:

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

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


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

這是您在 header 中已有的內容的補充。

注意:根據您的編輯,這將發生在任何 function 之外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM