我创建了 2 个 .cpp 文件和 2 个 .header 文件

  1. main.cpp(主 .cpp 文件)
  2. main.hpp(主头文件)
  3. 游戏.cpp
  4. 游戏.hpp

我在 game.hpp 中使用了 main.hpp 组件

代码:

#include <SFML/Graphics.hpp>
#include <bits/stdc++.h>
#include "Window.hpp"
using namespace std;

class Ship{
public:
    Ship();
    ~Ship();

    int ship_x=400-28;
    int ship_y=600-55;

    sf::Texture ship_texture;
    sf::Sprite ship_sprite;

    Window *window = new Window();

    void Ship_Void(){
        if(window->event.type==sf::Event::KeyPressed){
            if(window->event.key.code==sf::Keyboard::D){
                if(ship_sprite.getPosition().x<=544)
                    ship_sprite.move(sf::Vector2f(0.04, 0));
            }
            if(window->event.key.code==sf::Keyboard::A){
                if(ship_sprite.getPosition().x>=200)
                    ship_sprite.move(sf::Vector2f(-0.04, 0));
            }
            if(window->event.key.code==sf::Keyboard::W){
                if(ship_sprite.getPosition().y>=0)
                    ship_sprite.move(sf::Vector2f(0, -0.04));
            }
            if(window->event.key.code==sf::Keyboard::S){
                if(ship_sprite.getPosition().y<=545)
                    ship_sprite.move(sf::Vector2f(0, 0.04));
            }
        }
    }

    void Keys(){
        ship_texture.loadFromFile("images/spaceship.png");
        ship_sprite.setTexture(ship_texture);
        ship_sprite.setPosition(ship_x, ship_y);
    }
};

编译命令:

g++ Window.cpp -o game -lsfml-graphics -lsfml-window -lsfml-system

编译错误:

In file included from Ship.hpp:3,
                 from Window.cpp:2:
Window.hpp:5:7: error: redefinition of ‘class Window’
5     | class Window{
      |       ^~~~~~
In file included from Window.cpp:1:
Window.hpp:5:7: note: previous definition of ‘class Window’
5 | class Window{

请帮助修复此错误!

#1楼 票数:2

#include "game.hpp"放在文件 main.cpp 的顶部

#2楼 票数:0 已采纳

假设您想在main.cpp使用您在game.cpp定义的一些其他变量、函数、类或其他标识符。

指导原则是将您想在外部使用的内容的声明放在头文件中。

所以如果你有game.cpp这个内容(函数有两个定义):

#include <iostream>

namespace mygame {

    void a() { 
       std::cout << "A";
    }

    int b() {
       std::cout << "B";
       return 1;
    }

}

并且您想在 main.cpp 中使用b() ,然后在标题game.hpp添加b声明

#ifndef GAME_HPP
#define GAME_HPP

int b();

#endif

那么您在您的这头main.cpp通过把#include "game.hpp"在顶部main.cpp ,因此你被允许使用b()自由。 所以main.cpp可能看起来像:

#include <iostream>
#include "game.hpp"

int main()
{
   std::cout << "MAIN";
   mygame::b();
   int x = mygame::b(); // remember that b() returns int
}

注意game.hpp还包含一些丑陋的命令。 它们本身不是#include文件所必需的,但应该用于防止多个定义 要了解更多信息,请查找Header Guards

还要注意,因为您在技术上可以包含源文件game.cpp ,而不是game.hpp ,但不要这样做,因为编译器会向您显示大量令人费解的消息。 只是不要这样做,直到您知道预处理器 + 编译器 + 链接器如何协同工作。

  ask by BloodyBat translate from so

未解决问题?本站智能推荐:

1回复

SFML编译与静态库错误。C++

试图编译我愚蠢的 hello-world SFML 项目进行测试。 但是从链接器收到奇怪的错误消息。 (当我使用共享库编译时 - 一切正常。) 错误信息: …………等 gcc 版本 10.2.0(Ubuntu 10.2.0-13ubuntu1)。 我做错了什么/愚蠢?
1回复

C++中的错误压缩代码-SFML

这听起来像是一个愚蠢的问题... 我在C ++中有这段代码,它使用SFML库: #include <SFML/Graphics.hpp>#include <string>void textDisplay(sf::Text& display_text, std:
2回复

C++SFML编译错误sf::NonCopyable::NonCopyable(constsf::NonCopyable&)是私有的

当我尝试编译以下代码时: SFMLSet.cpp: SFMLSet.h: main.cpp: 我收到一些错误: SFML-2.3.2 \\ include / SFML / System / NonCopyable.hpp:67:5:错误:'sf :: NonCopyabl
1回复

c++和sfml编译问题[关闭]

关闭。 这个问题需要调试细节。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack O
1回复

sfml编译错误:此范围内未声明NULL

我正在运行Linux Mint。 版本信息如下: 我正在尝试编译和链接使用sfml的C ++程序的文件。 尝试编译文件时,我收到以下错误: 在ResourcePtr.inl文件中使用“NULL”似乎有问题。 就个人而言,我通常会避免使用这个关键字,而是使用0,但是当我在一个我自己甚
1回复

如何使用SFML在C++游戏中修复致命错误LNK1120?

我最近一直在使用SFML用C ++编写游戏,但最近试图使其更加面向对象。 但是,我收到此错误:1> Main.obj:错误LNK2019:函数_main中引用的未解析的外部符号“ void __cdecl gameMain(void)”(?gameMain @@ YAXXZ) 程序代
1回复

C++代码块和SFML库故障

我一直在尝试使用SFML库。 但是,到目前为止,我的所有尝试都导致了许多错误。 下面的代码与我想出的一样简单,但是仍然给我三个错误(下面列出的构建日志) --------------内部版本:在SFML_TEST_14-3中发布(编译器:GNU GCC编译器)--------------
1回复

如何使用tmxparser修复xstring异常?SFML/C++

我目前遇到一个问题,当我运行代码时,它会在xstring系统文件中的第3467行的异常处停止。 这是它的一些屏幕截图: 。 我认为它必须与加载文件或文件损坏有关。 它的解析方式有问题。 这是我的Github页面的链接。 我使用了tmxlite解析器来加载文件,这也是tmxlite