Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Błąd podczas linkowania klasy

Ostatnio zmodyfikowano 2014-06-25 18:16
Autor Wiadomość
DejaVu
» 2014-06-23 22:21:41
Sądzę, że problem może wynikać z cykli w include-ach (aczkolwiek nie da się tego zweryfikować na podstawie informacji, które podałeś).

http://cpp0x.pl/forum/temat/​?id=9299&p=2
http://cpp0x.pl/forum/temat/​?id=8302
P-112611
qest43
Temat założony przez niniejszego użytkownika
» 2014-06-23 23:01:55
Dodam wszystkie headery klas bo nie ma ich wiele:

To jest main --->

#include <iostream>
#include "InputManager.h"
#include "ScreenManager.h"

#include "allegro5\allegro_native_dialog.h"

C/C++
#pragma once

#include <allegro5\allegro.h>
#include <allegro5\allegro_image.h>
#include <allegro5\allegro_font.h>
#include <string>
#include "InputManager.h"

class Animation
{
public:
    Animation( void );
    ~Animation( void );
   
    virtual void LoadContent( ALLEGRO_BITMAP * image, std::pair < float, float > position );
    virtual void UnloadContent();
    virtual void Update( InputManager & input );
    void Draw( ALLEGRO_DISPLAY * display );
   
    void SetAlpha( float value );
    float GetAlpha();
   
protected:
    ALLEGRO_BITMAP * image;
    std::pair < float, float > position;
    float alpha;
};

C/C++
#pragma once
#include "Animation.h"


class FadeAnimation
    : public Animation
{
public:
    FadeAnimation( void );
    ~FadeAnimation( void );
   
    void LoadContent( ALLEGRO_BITMAP * image, std::pair < float, float > position );
    void UnloadContent();
    void Update( InputManager & input );
   
    bool GetIsActive();
    void SetIsActive( bool value );
private:
    float fadeSpeed;
    bool increase;
    bool isActive;
};

C/C++
#pragma once

#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <iostream>
#include <algorithm>

class FileManager
{
public:
    FileManager( void );
    ~FileManager( void );
   
    void LoadContent( const char * filename, std::vector < std::vector < std::string >> & contents, std::vector < std::string > & attributes );
   
private:
    std::vector < std::string > tempContents;
};

C/C++
#pragma once

#include <allegro5\allegro.h>
#include "InputManager.h"
#include "FileManager.h"

class GameScreen
{
protected:
    InputManager input;
    FileManager fileManager;
   
    std::vector < std::string > attributes;
    std::vector < std::vector < std::string >> contents;
public:
    GameScreen();
    ~GameScreen();
   
    virtual void LoadContent();
    virtual void UnloadContent();
    virtual void Update( ALLEGRO_EVENT ev );
    virtual void Draw( ALLEGRO_DISPLAY * display );
   
    InputManager GetInput();
};

C/C++
#pragma once

#include <allegro5\allegro.h>
#include <allegro5\keyboard.h>
#include <vector>

class InputManager
{
private:
    ALLEGRO_KEYBOARD_STATE keystate;
   
public:
    InputManager( void );
    ~InputManager( void );
   
    void Update();
   
    bool IsKeyPressed( ALLEGRO_EVENT ev, int key );
    bool IsKeyPressed( ALLEGRO_EVENT ev, std::vector < int > keys );
   
    bool IsKeyReleased( ALLEGRO_EVENT ev, int key );
    bool IsKeyReleased( ALLEGRO_EVENT ev, std::vector < int > keys );
   
    bool IsKeyDown( int key );
};

C/C++
#pragma once


#include "ScreenManager.h"
#include <vector>
#include "FileManager.h"
#include "InputManager.h"
#include <sstream>
#include <allegro5\allegro.h>
#include <allegro5\allegro_image.h>
#include <allegro5\allegro_font.h>
#include <allegro5\allegro_ttf.h>

class MenuManager
{
private:
    FileManager fileManager;
    InputManager input;
   
    std::vector < std::string > attributes;
    std::vector < std::vector < std::string >> contents;
   
    ALLEGRO_BITMAP * image;
    ALLEGRO_FONT * font;
    std::vector < std::string > items;
    std::vector < std::pair < float, float >> position;
    std::vector < std::string > menuLinks;
    std::pair < float, float > newImageSize;
    std::pair < float, float > imageSize;
   
    int align;
    int active;
    int itemColor;
    int itemNumber;
   
    void SetItems();
   
public:
    MenuManager( void );
    ~MenuManager( void );
   
    void LoadContent( std::string idMenu );
    void UnloadContent();
    void Update( ALLEGRO_EVENT ev );
    void Draw( ALLEGRO_DISPLAY * display );
};

C/C++
#pragma once

#include "InputManager.h"
#include <allegro5\allegro_font.h>
#include <allegro5\allegro_ttf.h>
#include "MenuManager.h"

class MenuScreen
    : public GameScreen
{
private:
    MenuManager menu;
public:
    MenuScreen( void );
    ~MenuScreen( void );
   
    void LoadContent();
    void UnloadContent();
    void Update( ALLEGRO_EVENT ev );
    void Draw( ALLEGRO_DISPLAY * display );
};

C/C++
#pragma once

#include <iostream>
#include <string>
#include <map>

//Allegro Inits
#include <allegro5\allegro.h>
#include <allegro5\allegro_image.h>
#include"GameScreen.h"
#include "SplashScreen.h"
#include "MenuScreen.h"

class ScreenManager
{
private:
    ScreenManager();
    ScreenManager( ScreenManager const & );
    void operator =( ScreenManager const & );
   
    GameScreen * currentScreen;
   
    std::map < std::string, GameScreen *> screenDirectory;
   
public:
    ~ScreenManager();
    static ScreenManager & GetInstance();
   
    void AddScreen( std::string newScreen );
   
    void Initialize();
    void LoadContent();
    void UnloadContent();
    void Update( ALLEGRO_EVENT ev );
    void Draw( ALLEGRO_DISPLAY * display );
};

C/C++
#pragma once

#include "ScreenManager.h"
#include "InputManager.h"
#include "FileManager.h"
#include "FadeAnimation.h"
#include <allegro5\allegro_font.h>
#include <allegro5\allegro_ttf.h>

class SplashScreen
    : public GameScreen
{
private:
    ALLEGRO_FONT * font;
    std::vector < ALLEGRO_BITMAP *> images;
   
    FadeAnimation fadeAnimation;
    ALLEGRO_BITMAP * fadeImage;
    std::pair < float, float > position;
   
    int imageNumber;
public:
    SplashScreen( void );
    ~SplashScreen( void );
   
    void LoadContent();
    void UnloadContent();
    void Update( ALLEGRO_EVENT ev );
    void Draw( ALLEGRO_DISPLAY * display );
};
P-112615
DejaVu
» 2014-06-24 11:15:53
Rozrysuj sobie na kartce nazwy plików i strzałkami połącz który plik includuje jaki. Jeżeli w grafie pojawi się cykl to znaczy, że źle zaprojektowałeś zależności.
P-112631
qest43
Temat założony przez niniejszego użytkownika
» 2014-06-25 14:22:29
Żaden cykl nie zachodzi:
http://screenshooter.net/6815011/xmbaknn
Strzałki oznaczają pliki które są dołączane.

Jedynie ScreenManager jest dodawany do MenuScreen, który zawiera MenuManager, a MenuManager zawiera ScreenManager. Ale to powinno działać.
P-112717
pekfos
» 2014-06-25 17:40:19
Żaden cykl nie zachodzi:
Ja na tym rysunku widzę cykl.
SplashScreen.h <-> ScreenManager.h.
P-112732
qest43
Temat założony przez niniejszego użytkownika
» 2014-06-25 17:46:40
No to czemu to działało (błąd wystąpił dopiero po dodaniu screen managera). Poza tym obie muszą się nawzajem linkować, bo ScreenManager.h to singleton w którego metodzie są obiekty splash screena, a w  SplashScreen.h jest funkcja ze ScreenManagera, statyczna bo to singleton.
P-112737
pekfos
» 2014-06-25 17:48:23
No to czemu to działało (błąd wystąpił dopiero po dodaniu screen managera).
Na moje oko, to właśnie wymieniłem ów nagłówek, jako element cyklu..

Poza tym obie muszą się nawzajem linkować
W takim razie Twój projekt jest błędny.
P-112738
qest43
Temat założony przez niniejszego użytkownika
» 2014-06-25 18:02:17
W singletonie ScreenManager są metody tworzące nowe obiekty okienek, dlatego każda klasa okienka musi być podlinkowana w ScreenManager. Natomiast klasa okienek, np. SplashScreen ma podlinkowany ScreenManager bo wywołuje on metodę statyczną która zmienia na inne okienko,usuwa dane itp.
P-112740
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona