如何调用在另一个文件上找到的函数?


73

我最近开始使用C ++和SFML库,我想知道我是否在适当地称为“ player.cpp”的文件上定义了Sprite,如何在位于“ main.cpp”的主循环中调用它?

这是我的代码(请注意,这是SFML 2.0,而不是1.6!)。

main.cpp

#include "stdafx.h"
#include <SFML/Graphics.hpp>
#include "player.cpp"

int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "Skylords - Alpha v1");

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw();
        window.display();
    }

    return 0;
}

播放器

#include "stdafx.h"
#include <SFML/Graphics.hpp>

int playerSprite(){
    sf::Texture Texture;
    if(!Texture.loadFromFile("player.png")){
        return 1;
    }
    sf::Sprite Sprite;
    Sprite.setTexture(Texture);
    return 0;
}

我需要帮助的main.cpp地方window.draw();是我的绘图代码中所说的地方。在该括号中,应该有要加载到屏幕上的Sprite的名称。据我搜索并通过猜测进行的尝试,我还没有成功地使该draw函数与我的sprite在另一个文件上一起使用。我觉得我缺少大的东西,而且很明显(在两个文件中都很明显),但是每位专业人士再一次都是新手。

Answers:


104

您可以使用头文件。

好的做法。

您可以player.h在该头文件中创建一个名为声明所有其他cpp文件所需的所有功能的文件,并在需要时将其包括在内。

播放器

#ifndef PLAYER_H    // To make sure you don't declare the function more than once by including the header multiple times.
#define PLAYER_H

#include "stdafx.h"
#include <SFML/Graphics.hpp>

int playerSprite();

#endif

播放器

#include "player.h"  // player.h must be in the current directory. or use relative or absolute path to it. e.g #include "include/player.h"

int playerSprite(){
    sf::Texture Texture;
    if(!Texture.loadFromFile("player.png")){
        return 1;
    }
    sf::Sprite Sprite;
    Sprite.setTexture(Texture);
    return 0;
}

main.cpp

#include "stdafx.h"
#include <SFML/Graphics.hpp>
#include "player.h"            //Here. Again player.h must be in the current directory. or use relative or absolute path to it.

int main()
{
    // ...
    int p = playerSprite();  
    //...

这不是一个好的做法,但适用于小型项目。在main.cpp中声明您的函数

#include "stdafx.h"
#include <SFML/Graphics.hpp>
// #include "player.cpp"


int playerSprite();  // Here

int main()
{
    // ...   
    int p = playerSprite();  
    //...

2
好吧,先生,您快要拯救我的屁股了。我一直都听说过这些该死的头文件,但从未真正研究过它们,它们非常重要,是吗?但是,这是另一个问题,当我完成此操作并将其导入到“ main.cpp”中后,“ main.cpp”文件在window.draw区域中会是什么样子,怎么办?
Safixk

@Safixk是的。当您的代码开始变得更大时,它们变得非常重要。如果您有多个cpp文件,建议您创建头文件

好吧,尝试您刚刚给我发送的新代码,请返回5
Safixk

问题,在我的player.h文件中-“ #idndef PLAYER_H”“ #idndef”无法识别为预处理设备-您是不是偶然会使用“ #ifndef”?
Safixk

另外,我的“ main.cpp”文件在“ window.draw”区域中的外观如何?
Safixk

13

除了@ user995502的关于如何运行程序的答案之外,还有一点点。

g++ player.cpp main.cpp -o main.out && ./main.out


0

您的精灵是通过playerSprite函数中途创建的...它也超出了范围,并在同一函数的末尾不再存在。必须在可以将其传递给playerSprite进行初始化的位置以及可以将其传递给draw函数的位置创建该sprite。

也许在您的第一个之上声明它while


5
这应该是一条评论,因为它与他所问的问题无关
Chachmu 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.