如何正确使用带函数的指针并返回?

时间:2018-03-17 16:27:31

标签: c++ function pointers vector sfml

我希望在类中有一个sf :: Texture(sfml)数组,然后想要一个函数返回一个指向数组(向量)中特定项的指针。 然后我想将它传递给sprite.SetTexture(也是SFML),它需要一个sf :: texture。 但我无法让它发挥作用,这就是我现在所拥有的,我留下了不重要的东西:

class SpriteTextures
{
public:
    std::vector<sf::Texture> Textures;

    //code to fill the vector here

    sf::Texture *GetSecondTexture()
    {
        return &Textures[1];
    }
};

class DrawSprite
{
    sf::Texture *texture;
    sf::Sprite sprite;

public:
    void SetSpriteTexture()
    {
        SpriteTextures SprTexs;
        texture = SprTexs.GetSecondTexture();
        sprite.setTexture(texture, true); // Gives error about no suitable constructor exists to convert from sf::Texture * to sf::Texture

        // do some other stuff with the texture here.
    }
};

这是Sprite :: setTexture的函数defenition:

void setTexture(const Texture& texture, bool resetRect = false);

它给出的错误我把它作为注释放在代码中(在setTexture函数旁边) 所以我想要的是,不是将矢量项的副本复制到DrawSprite类中的纹理var,而是希望DrawSprite中的*纹理指向矢量中的项。 但我确实想先在DrawSprite中设置*纹理,因为我也想将它用于其他事情。 所以我希望能够为我的*纹理提供setTexture函数,并让它在SpriteTextures类的向量中读取sf :: Texture。(而不是在DrawSprite类本身的纹理变量中读取它的副本。

如果有人理解我刚才说的话,有人可以帮助我让它正常工作吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

基本上,在这个功能中:

void SetSpriteTexture()
{
    SpriteTextures SprTexs;
    texture = SprTexs.GetSecondTexture();
    sprite.setTexture(texture, true); // Gives error about no suitable constructor exists to convert from sf::Texture * to sf::Texture

    // do some other stuff with the texture here.
}

您将sf::Texture*传递给sprite.setTexture(..),而实际上需要sf::Texture&。只需将呼叫更改为:

sprite.setTexture(*texture, true);

或者,让你的其他函数只返回一个引用:

sf::Texture& GetSecondTexture()
{
    return Textures[1];
}

这意味着您现在正在返回默认情况下精灵所需的内容。当然,您必须确保纹理容器至少与您的精灵一样保持活动状态,否则纹理参考将不再有效。

修改

另外,看一下评论,您似乎对*运算符和&运算符感到有些困惑。这是一个快速片段,用于解释这些运算符的各种用例:

int a = 42;

int* b = &a; // * Declares pointer. & Takes address of a
int& c = a;  // & Declares reference.

*b = 32;     // * Dereferences the pointer, meaning you get the value it points to.
             // a, and c are now 32, and b points to a, which holds the value 32.