C ++ - неопределенная ссылка на объект - PullRequest
1 голос
/ 02 октября 2011

Компилятор: MinGW
IDE: Код :: Блоки
Платформа: Windows XP
Внешние библиотеки: SDL, SDL_image
Что я пытаюсь сделать: Ограничить частоту кадров при 60 кадрах в секунду, используя таймер, который сбрасывается после каждого цикла.
Просто предупреждение, я неопытен в C ++, но я провел исследование и не могу найти такого рода ошибки где-либо еще. Я уверен, что это связано с областью действия, но я не уверен, как решить это.


Выход компилятора:
In function ZN4data6OnLoopEv':|'C:\Documents and Settings\Evan\My Documents\Programming Projects\Roguelike SDLtest 2\OnLoop.cpp|5|undefined reference to 'fps'

C:\Documents and Settings\Evan\My Documents\Programming Projects\Roguelike SDLtest 2\OnLoop.cpp|7|undefined reference to 'fps'

C:\Documents and Settings\Evan\My Documents\Programming Projects\Roguelike SDLtest 2\OnLoop.cpp|9|undefined reference to 'fps'

main.cpp:

#include "data.h"
bool data::OnExecute()
{
    if (OnInit() == false)
    {
        data::log("Initialization failure.");
        return 1;
    }
    SDL_Event Event;
    while(running == true)
    {
        fps.start();
        while(SDL_PollEvent(&Event))
        {
            OnEvent(&Event);
        }
        OnRender();
        OnLoop();
        log(convertInt(1000/fps.get_ticks()));
    }
    OnCleanup();
    data::log("Program exited successfully.");
    return 0;
}

data.h:

#ifndef _DATA_H_
    #define _DATA_H_

#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <string>
#include <fstream>
#include <sstream>
#include "globals.h"

class timer
{
private:
    int     startTicks; //Clock time at timer start
    bool    started;    //Timer status
    int     frame;

public:
    void    Timer();  //Set timer variables

    //Clock actions
    void    start();
    void    stop();

    //Get timer status
    int     get_ticks();

    bool    is_started();   //Checks timer status
    void    incframe();
};

class data
{
private:
    timer fps;
    bool    running;
    SDL_Surface*    display;
    SDL_Surface*    tileset;    //The tileset
    SDL_Rect    clip[255];
    int     spritewidth;
    int     spriteheight;
    bool    mapfloor[80][24];     //Contains the locations of the floor and walls
    int    mapplayer[80][24];    //Contains the location of the player
    SDL_Rect   playersprite;       //Clip value of the sprite that represents the player
    std::string  tilesetdsk;    //Location of the tileset on disk
    std::string     debugfile;
    int     FRAMES_PER_SECOND;  //Max FPS

public:
    data();
    bool    OnExecute();
    bool    OnInit();
    void    OnEvent(SDL_Event* Event);
    void    OnLoop();
    void    OnRender();
    void    OnCleanup();
    static  SDL_Surface*    load_image(std::string filename);
    static  void    apply_surface(int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip);
    void    LoadSprite();   //Determines what sprite is where in the tileset
    bool    levelgen();     //Generates a level
    void    log(std::string);          //**DEBUG** function for logging to file
    void    setvars();
    std::string convertInt(int number);
};
#endif

OnLoop.cpp:

#include "data.h"
void data::OnLoop()
{
    if(fps.get_ticks() < 1000/FRAMES_PER_SECOND)
    {
        SDL_Delay((1000/FRAMES_PER_SECOND) - fps.get_ticks());
    }
    fps.incframe();
}

Ответы [ 2 ]

3 голосов
/ 02 октября 2011

fps - это переменная типа timer, объявленная в data::OnExecute().

Однако вы также ссылаетесь на fps в другом методе data::OnLoop(), где fps находится вне области видимости..

Чтобы это исправить, я рекомендую сделать fps переменной-членом класса data.Тогда fps всегда будет доступен во всех методах data.

Сделайте это, объявив fps правильно с другими переменными-членами
(в разделе private: class data)
Удалить объявление в data::OnExecute().

0 голосов
/ 02 октября 2011

Вы должны переместить объявление переменной fps в файл заголовка. Переменная fps определяется только в области действия data :: OnExecute. Если вы переместите его в класс, все методы класса могут получить к нему доступ.

Итак:
1. Убрать "таймер фпс"; строка из данных :: OnExecute.
2. Добавьте «таймер fps»; ниже "private:" в data.h

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...