【问题标题】:Is the cartTexture member actually initialized correctly?cartTexture 成员是否实际初始化正确?
【发布时间】:2014-10-09 16:35:41
【问题描述】:

问题描述:

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

根据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 的唯一构造函数是“从另一个sf::Texture 复制”和上面提到的构造函数时,我该如何在编译时执行此操作?我不能使用函数调用来加载图像,对吧?

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

代码:

ma​​in.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;
}

【问题讨论】:

  • From documentation: "如果您将 SFML 安装到非标准路径,您需要告诉链接器在哪里可以找到 SFML 库(.so 文件):" i> 所以也许添加-L&lt;sfml-install-path&gt;/lib
  • 不,它在正确的位置——我已经使用这组链接器选项有效地编译了其他程序。此外,如果sf::Vector2fs 和sf::Colors 以某种方式工作正常,但sf::Texture 不起作用,当库路径混乱时,这会有点奇怪。我相信这个问题与变量的初始化有关。
  • 哦,是static。您需要像 textureLoc 那样初始化它。在Cart::textureLoc初始化后添加sf::Texture Cart::cartTexture;

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


【解决方案1】:

static 类成员变量必须在类定义之外进行初始化/定义。你这样做是为了textureLoc 而不是cartTexture。在main()之前添加:

sf::Texture Cart::cartTexture;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多