2015-09-21 3 views
0

Я недавно изучал C++, и я пытался создать простой класс, разбитый на заголовок & исходного файла. Тем не менее, я, кажется, продолжают получать эту ошибку:Использование необъявленного идентификатора C++

ship.cpp:21:9: error: use of undeclared identifier 'image' 
     return image; 
      ^
1 error generated. 

Я включил исходный код ниже:

main.cpp:

#include <iostream> 

#include <allegro5/allegro.h> 
#include <allegro5/allegro_image.h> 
#include <allegro5/allegro_native_dialog.h> 

#include <ship.h> 

int main(int argc, char **argv){ 
    ALLEGRO_DISPLAY *display = nullptr; 
    ALLEGRO_BITMAP *image = nullptr; 


    if(!al_init()){ 
     al_show_native_message_box(display, "Error", "Error", "Failed to initialise allegro", NULL, ALLEGRO_MESSAGEBOX_ERROR); 
     return 0; 
    } 

    if(!al_init_image_addon()) { 
     al_show_native_message_box(display, "Error", "Error", "Failed to initialize al_init_image_addon!", NULL, ALLEGRO_MESSAGEBOX_ERROR); 
     return 0; 
    } 

    display = al_create_display(800,600); 
     if(!display) { 
     al_show_native_message_box(display, "Error", "Error", "Failed to initialize display!", NULL, ALLEGRO_MESSAGEBOX_ERROR); 
     return 0; 
     } 


    Ship ship("image.jpg"); 
    al_draw_bitmap(ship.get_image(), 200, 200, 0); 

    al_flip_display(); 
    al_rest(2); 
    return 0; 
} 

ship.h:

#ifndef SHIP_H 
#define SHIP_H 
#include <iostream> 
#include <allegro5/allegro.h> 
#include <allegro5/allegro_image.h> 

class Ship 
{ 
    ALLEGRO_BITMAP *image; 

    private: 
     int width; 
     int height; 

    public: 
     Ship(std::string image_file); 
     ALLEGRO_BITMAP *get_image(); 
}; 

#endif 

ship.cpp:

#include <allegro5/allegro.h> 
#include <allegro5/allegro_image.h> 
#include <allegro5/allegro_native_dialog.h> 
#include <iostream> 

#include <ship.h> 




Ship::Ship(std::string image_file){ 
    image = al_load_bitmap(image_file.c_str()); 
    if(image == nullptr){ 
     std::cout << "Ship went down." << std::endl; 
    } 
    std::cout << "Ship loaded successfully." << std::endl; 
} 


ALLEGRO_BITMAP *get_image(){ 
    return image; 
} 

ответ

4

Вы определили функцию неправильно. get_image() является членом класса Ship. Ваше определение создает автономную функцию.

ALLEGRO_BITMAP *get_image(){ 

Должно быть:

ALLEGRO_BITMAP* Ship::get_image(){ 

(звездочка приложена для удобства чтения)

+0

Ой, не заметил этого. Благодаря! Btw, согласны ли размещать звездочку с типом возврата, поскольку это улучшает читаемость? то есть «ALLEGRO_BITMAP *» в отличие от «ALLEGRO_BITMAP *»? – Calculus5000

+1

Это действительно просто стиль. Я предпочитаю ставить звездочку слева, когда это возвращаемое значение функции, но справа, когда это объявление переменной или разыменование. – Olipro

1

Как это определено в настоящее время, get_image() это просто функция, которая не имеет ничего общего с классом. Тот факт, что он находится в ship.cpp, является несущественным. Так как вы пытаетесь реализовать метод из Ship класса, вам необходимо определить реализацию с префиксом Ship:::

ALLEGRO_BITMAP* Ship::get_image() { 
    return image; 
}