功能未按预期工作

Function not working as intended?

本文关键字:工作 功能      更新时间:2023-10-16

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

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

谢谢你的帮助!

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

语法

void FontParam(sf::Text obj

被称为"pass-by-value"-您将原始sf::Text的值传递给该函数,并创建一个新的本地副本,该副本具有该函数的生存期。

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

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

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

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

传递引用在接收器的变量名上使用"&"装饰器。Pass-by-pointer使用"&"引用来获取发送变量的地址,并使用"*"作为接收器上的装饰符,但您还必须检查空指针并使用取消围栏,所以我只描述Pass-by-reference。

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