Как я могу исправить ошибку компиляции кода sfml c ++? - PullRequest
0 голосов
/ 21 февраля 2020

Я создал 2. cpp файлов и 2 .header-файлов

  1. main. cpp (main. cpp file)
  2. main.hpp (main файл заголовка)
  3. game. cpp
  4. game.hpp

Я использовал компоненты main.hpp в game.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{

Пожалуйста, помогите исправить эту ошибку!

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Поместите #include "game.hpp" поверх файла main. cpp

0 голосов
/ 21 февраля 2020

Допустим, вы хотите использовать в main.cpp некоторые другие переменные, функции, классы или другие идентификаторы, которые вы определили в game.cpp.

Рекомендуется поместить объявлений того, что вы хотите использовать извне, в заголовочный файл.

Итак, если у вас есть это содержимое game.cpp (есть два определения функций):

#include <iostream>

namespace mygame {

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

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

}

, и вы хотите использовать b() в своем main. cpp, затем вы добавляете объявление из b в заголовок game.hpp:

#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 файла как такового, но должны использоваться для защиты от нескольких определений . Чтобы узнать больше, ищите Заголовки

Также будьте осторожны, так как технически вы можете включить исходный файл game.cpp вместо game.hpp, но не делайте этого, так как Компилятор покажет вам множество загадочных сообщений. Только не делайте этого, пока не узнаете, как препроцессор + компилятор + компоновщик работают вместе.

...