cartTexture成员实际上是否已正确初始化?

时间:2014-08-15 22:11:29

标签: c++ g++ initialization sfml static-members

问题描述:

我正在制作一个每个实例中都有sf::SpritecartSprite)的Cart类。但是,生成购物车的静态sf::TexturecartTexture)在所有Cart对象之间共享。在构建Cart时,精灵会从纹理中加载。

根据the documentationsf::Texture有一个默认构造函数:

  

创建一个空纹理。

但是,当我编译下面的代码时,声明但未定义sf::Texture,我得到链接器错误:

/tmp/cclJ5hJp.o: In function `Cart::Cart(sf::Vector2<float> const&, sf::Color, float)':
main.cpp:(.text._ZN4CartC2ERKN2sf7Vector2IfEENS0_5ColorEf[_ZN4CartC5ERKN2sf7Vector2IfEENS0_5ColorEf]+0x46): undefined reference to `Cart::cartTexture'
main.cpp:(.text._ZN4CartC2ERKN2sf7Vector2IfEENS0_5ColorEf[_ZN4CartC5ERKN2sf7Vector2IfEENS0_5ColorEf]+0x87): undefined reference to `Cart::cartTexture'
main.cpp:(.text._ZN4CartC2ERKN2sf7Vector2IfEENS0_5ColorEf[_ZN4CartC5ERKN2sf7Vector2IfEENS0_5ColorEf]+0x9b): undefined reference to `Cart::cartTexture'
main.cpp:(.text._ZN4CartC2ERKN2sf7Vector2IfEENS0_5ColorEf[_ZN4CartC5ERKN2sf7Vector2IfEENS0_5ColorEf]+0xb6): undefined reference to `Cart::cartTexture'
collect2: error: ld returned 1 exit status

这是否意味着我应该初始化(定义)cartTexture?如果是这样,当sf::Texture的唯一构造函数是&#34;从另一个sf::Texture&#34;复制时,如何在编译时执行此操作。和上面提到的那个?我无法使用函数调用将图像加载到其中,对吗?

使用以下代码编译代码: g++ main.cpp -Wall -Wextra -Werror -std=c++11 -lsfml-graphics -lsfml-window -lsfml-system -o exec

代码:

的main.cpp

#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>
#include <mutex>

class Cart : public sf::Drawable {

    public:
        // Constructor- create with position, orientation, and color.
        Cart(const sf::Vector2f& cartPos_, sf::Color cartColor_, float cartAngle_) {

            if (!cartTexture.loadFromFile(textureLoc)) {
                std::cout << "File is nonexistent." << std::endl;
            } else {
                cartTexture.setSmooth(true);
                cartTexture.setRepeated(false);
            }   

            cartSprite.setTexture(cartTexture);

            cartSprite.setPosition(cartPos_);
            cartSprite.setRotation(cartAngle_);
            cartSprite.setColor(cartColor_);
        }

    private:
        void draw(sf::RenderTarget& target, sf::RenderStates states) const {
            target.draw(cartSprite, states);
            return;
        }

        static sf::Texture cartTexture;
        static const std::string textureLoc;

        sf::Sprite cartSprite;
};

const std::string Cart::textureLoc = "cart-empty.png";

int main() {

    Cart testCart(sf::Vector2f(), sf::Color(200,200,200), 0);

    return 0;
}

1 个答案:

答案 0 :(得分:2)

static类成员变量必须在类定义之外进行初始化/定义。您为textureLoc但不是cartTexture执行此操作。在main()之前添加:

sf::Texture Cart::cartTexture;