功能不按预期工作?

时间:2013-08-26 17:05:16

标签: c++ function text fonts sfml

首先,我想说我在编程方面仍然是一个完整的新手,我已经找到了这个问题的答案,事情是,我不确定是什么问题。

我编写了一个函数来设置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);
}

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您正在将t[0]副本传递到您的函数中,更改副本,然后放弃更改。相反,您可能希望通过引用传递t[0],以便更改更新到原始对象。通过将参数sf::Text obj更改为sf::Text& obj可以轻松完成此操作(请注意添加了&)。

答案 1 :(得分:0)

语法

void FontParam(sf::Text obj

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

这是一种默认行为,因为大多数情况下,您将值传递给函数,并且不希望该函数修改您的本地工作。

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

如果“function(i)”将“i”改为11,则会出现错误行为。

要更直接地传递变量,以便调用者和函数共享同一个实例,必须使用pass-by-reference或pass-by-pointer。

Pass-by-reference使用“&amp;”装饰器在接收器上的变量名称。传递指针使用“&amp;”引用获取发送变量的地址和接收器上的“*”作为装饰器,但是你还必须检查空指针并使用derefences,所以我只是要描述传递引用。< / p>

#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&amp; amp;避免复制的开销(复制字符串会很快变得昂贵)。

相关问题