1

首先,我想说在编程方面我还是一个完全的新手,而且我已经在寻找这个问题的答案,但我不确定出了什么问题。

我写了一个函数来为 sf::Text 对象设置参数:

void FontParam(sf::Text obj, sf::Font font, std::string text, sf::Color color, int size, int positionX, int positionY)
{
    obj.setCharacterSize(size);
    obj.setFont(font);
    obj.setColor(color);
    obj.setString(text);
    obj.setPosition(positionX,positionY);
}

使用:

FontParam(t[0],font_Clubland,"R",sf::Color::White,100,100,100);

并且绘制它不起作用。把它写成:

t[0].setFont(font_Clubland);
t[0].setColor(sf::Color::White);
t[0].setPosition(100,100);
t[0].setString("R");    
t[0].setCharacterSize(100);

并绘制它。

非常感谢任何帮助或提示,在此先感谢!

编辑: - - - - - - - - - - - - - -

万一有人想知道,访问冲突正在发生,因为我没有引用 sf::Font。正确的功能是:

void FontParam(sf::Text &obj, sf::Font &font, std::string text, sf::Color color, int size, int positionX, int positionY)
{
    obj.setCharacterSize(size);
    obj.setFont(font);
    obj.setColor(color);
    obj.setString(text);
    obj.setPosition(positionX,positionY);
}

谢谢您的帮助!

4

2 回答 2

2

您将副本传递给t[0]您的函数,更改副本,然后丢弃更改。相反,您可能希望t[0]通过引用传递您的更改,以便将更改更新到原始对象中。这很容易通过将参数更改sf::Text objsf::Text& obj(注意&添加)来完成。

于 2013-08-26T17:15:15.903 回答
0

语法

void FontParam(sf::Text obj

被称为“按值传递” - 您将原始 sf::Text 的值传递给此函数,并在函数的生命周期内创建一个新的本地副本。

这是默认行为,因为大多数时候,您将值传递给函数并且不希望函数修改您的本地工作。

for (int i = 0; i < 10; ++i) {
    function(i);
}

如果 "function(i)" 将 "i" 更改为 11,你会得到错误的行为。

要更直接地传递变量,以便调用者和函数共享同一个实例,您必须使用传递引用或传递指针。

引用传递在接收方的变量名上使用“&”装饰器。传递指针使用“&”引用来获取发送变量的地址,并使用“*”作为接收器上的装饰器,但是您还必须检查空指针并使用取消引用,所以我只是将描述传递引用。

#include <iostream>
#include <string>

void foo1(std::string str) {
    str += "Hello";
}

void foo2(std::string str) {
    str += "World";
}

int main() {
    std::string str = "";
    foo1(str);
    foo2(str);
    std::cout << str << std::endl;
}

将输出“世界”。

您可能必须在许多地方使用类似的更改来改进您的代码。

帮助自己避免犯此类错误的一个好方法是,当您特别希望参数不可变时,将参数装饰为“const”,这可能会迫使您自己使用局部变量来捕获修改。

void print(const std::string& str, const int x, const int y)
{
    const int endX = x + widthPx(str) + 4;
    const int endY = y + heightPx(str) + 4;
    drawBow(x, y, endX, endY);
    const int cursX = x + 1;
    const int cursY = y + 1;
    cursor(cursX, cursY);
    drawText(str);
}

请注意,如果可能,您应该通过 const& 获取 std::string 以避免复制的开销(复制字符串会很快变得昂贵)。

于 2013-08-26T17:35:51.573 回答