• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ - Multiple definition of

Object Storage Arubacloud
0 głosów
1,294 wizyt
pytanie zadane 5 grudnia 2018 w C i C++ przez Czapa10 Nowicjusz (180 p.)

WItam! Piszę sobie obiektowo gre w C++ z użyciem biblioteki SFML.

W pliku main.cpp kompilator pokazuje błąd: multiple definition of 'HS::data'

main.cpp

#include "game.hpp"

int main()
{ //<- dokładnie w tym miejscu
    HS::Game game;
    game.run();

    return 0;
}

Co powinienem zrobić by obejść ten problem.

Poniżej reszta kodu:

 

game.hpp

#pragma once

#include <SFML/Graphics.hpp>

#include "stateLogo.hpp"

namespace HS
{

    struct Data{
        sf::RenderWindow window;
        sf::Event event;
    };

    Data data;

    enum StatesEnum{
        logo,
        exit
    };

    class Game{
    public:
        Game();
        void run();

    private:
        ///states
        StatesEnum states;

        StateLogo stateLogo;

        int screenWidth{800};
        int screenHeight{800};
    };

}

 

game.cpp

#include "game.hpp"

namespace HS
{

    Game::Game(){
        data.window.create( sf::VideoMode(screenWidth, screenHeight), "HEALTHY SNAKE", sf::Style::Default);
    }

    void Game::run(){
        while( data.window.isOpen() ){
        ///GAME LOOP

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

            switch( states ){
            case logo:
                stateLogo.run();
                break;
            case exit:
                data.window.close();

            }

        }

    }

}

 

stateLogo.hpp

#pragma once

namespace HS
{

    class StateLogo{
    public:
        void run();

    private:
        void input();
        void update();
        void draw();
    };

}

 

stateLogo.cpp

#include <iostream>

#include "stateLogo.hpp"
#include "game.hpp"

namespace HS
{
    void StateLogo::run(){
        input();
        update();
        draw();
    }

    void StateLogo::input(){

    }

    void StateLogo::update(){

    }

    void StateLogo::draw(){
        data.window.clear(sf::Color::White);

        std::cout<<"logos"<<std::endl;

        data.window.display();
    }

}

 

2 odpowiedzi

0 głosów
odpowiedź 5 grudnia 2018 przez criss Mędrzec (172,590 p.)

`Data data` powinno być extern. Inaczej kompilator rozumie to jako definicje `Data data` w każdej translation unit do której trafi game.hpp. 

Tzn:
w headerze (hpp)
 

namespace HS {
extern Data data;
}

w source file (cpp):

namespace HS {
Data data;
}

A w ogóle idealnie by było bez zmiennych globalnych.

komentarz 5 grudnia 2018 przez Czapa10 Nowicjusz (180 p.)
Nie rozumiem. Niby w którym pliku  powinienem dodać extern?
komentarz 5 grudnia 2018 przez criss Mędrzec (172,590 p.)
No w tym `Data data;` - game.hpp
0 głosów
odpowiedź 6 grudnia 2018 przez mokrowski Mędrzec (156,100 p.)
Masz błąd koncepcyjny. W plikach *.hpp z zasady nie emituje się kodu a u Ciebie jest emisja na Data data; w 15 linii game.hpp.

Jeśli jednak jesteś pewien że taka zmienna globalna ma być, zrób jak poradził Criss

Podobne pytania

0 głosów
1 odpowiedź 416 wizyt
pytanie zadane 20 czerwca 2020 w C i C++ przez NieMaJuzNazw Użytkownik (890 p.)
0 głosów
1 odpowiedź 135 wizyt
0 głosów
1 odpowiedź 165 wizyt
pytanie zadane 26 grudnia 2020 w C i C++ przez Marcinnok Użytkownik (780 p.)

92,634 zapytań

141,505 odpowiedzi

319,883 komentarzy

62,015 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...