我正在使用SFML和结构进行测试,所以我决定用C ++编写这么少的代码,然后它出现了失败:
/tmp/ccudZjgy.o: In function `fontconfig()':
main.cpp:(.text+0x96): undefined reference to `Text::font'
/tmp/ccudZjgy.o: In function `textconfig()':
main.cpp:(.text+0x146): undefined reference to `Text::font'
main.cpp:(.text+0x1fa): undefined reference to `Text::text'
/tmp/ccudZjgy.o: In function `window()':
main.cpp:(.text+0x3d8): undefined reference to `Text::text'
collect2: error: ld returned 1 exit status
这是我的代码:
#include <SFML/Graphics.hpp>
struct Text{
static sf::Font font;
static sf::Text text;
};
void fontconfig()
{
sf::Font font;
font.loadFromFile("flower.ttf");
Text Text1;
Text1.font = font;
}
void textconfig()
{
Text Text1;
sf::Text text;
text.setFont(Text1.font);
text.setCharacterSize(100);
text.setColor(sf::Color::Red);
text.setString("Ugh...");
text.setStyle(sf::Text::Bold);
Text1.text = text;
}
void window()
{
Text Text1;
sf::RenderWindow window(sf::VideoMode(300, 150), "Hello");
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear(sf::Color::White);
window.draw(Text1.text);
window.display();
}
}
int main()
{
fontconfig();
textconfig();
window();
return 0;
}
答案 0 :(得分:1)
函数内的变量是局部变量。由于命名空间的工作方式,首先引用与全局变量同名的局部变量,如果你愿意,可以使用前面的双冒号来引用全局变量:
Foo // refers to the default, local scope
::Foo // refers to the global scope
换句话说,你从未真正触及全局变量。
相反,当您离开函数范围时,您修改的局部变量将被丢弃。
相反,如果您希望使用子例程mutator样式,则应该将外部资源类作为参数引用传递给函数,如下所示:
void textconfig(sf::Text& text); // pass by reference for a subroutine-focused, mutator style