我正在制作一个每个实例中都有sf::Sprite
(cartSprite
)的Cart类。但是,生成购物车的静态sf::Texture
(cartTexture
)在所有Cart对象之间共享。在构建Cart时,精灵会从纹理中加载。
根据the documentation,sf::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;
}
答案 0 :(得分:2)
static
类成员变量必须在类定义之外进行初始化/定义。您为textureLoc
但不是cartTexture
执行此操作。在main()
之前添加:
sf::Texture Cart::cartTexture;