2015-11-06 11 views
0

Ошибка LNK2001 неразрешенный внешний символ «Класс объекта объекты»неразрешенный внешний символ «класс»

Когда класс объявлен как экстерном, он будет создавать эту ошибку компоновщика для каждого фрагмента кода, подключенного к нему. Но когда я создаю приватную версию класса в других файлах, они работают нормально.

Изменение имени переменной класса не имеет никакого эффекта, поэтому оно не конфликтует с системой отображения, вызывающей ошибку.

Я не могу видеть и исправить ошибки. Раньше он работал, и я расстегивал файлы в надежде на то, что он снова работает, но этого не произошло.

Object.cpp

#include "object.h" 

#include "Ball.h" 

// Constructor 
Object::Object() { 

    std::map<int, std::map<int, IMAGEINFO>> object; 

}; 

Object::~Object() { 

    object.clear(); 

};  

void Object::Update() { 

    // Gets all the base object ID's 
    for (unsigned int i = 0; i < object.size(); i++) { 

    // Gets all the object's inside that ID. 
     for (unsigned int j = 0; j < object[i].size(); j++) { 

      // Gets the object. 
      IMAGEINFO obj = object[i][j]; 

      // Calls for the processes of the object 
      obj.Update(); 
     } 
    } 
} 

void Object::Render(HDC hdc, RECT* prc, BITMAP bm) { 

    // Gets all the base object ID's 
    for (unsigned int i = 0; i < object.size(); i++) { 

     // Gets all the object's ID's. 
     for (unsigned int j = 0; j < object[i].size(); j++) { 

      // Gets the object.  
      IMAGEINFO obj = object[i][j]; 

      // Calls for the rendering of the object   
      obj.Render(hdc, prc, bm); 

     } 
    } 
} 

int Object::addObject(IMAGEINFO obj) { 

    bool index = false; 
    int indexVal; 
    short run = 0; 

    while (!index) { 

     if (typeid(obj).name() == typeid(object[run]).name()) { 

      object[run][object[run].size()] = obj; 
      indexVal = object[run].size(); 
      index = true; 

     } 
     else if (run == object.size()) { 

      object[run][0] = obj; 
      indexVal = 0; 
      index = true; 

     } 

     run++; 

    } 

    return indexVal; 

} 

object.h

#ifndef OBJECT_H 
#define OBJECT_H 
#endif 

#include <windows.h> 
#include <iostream> 
#include <map> 

#include "renderer.h" 
#include "resource.h" 

class Object { 
public: 

    // Constructors/Deconstructors 
    Object(); 
    ~Object(); 

    // Processes 
    int addObject(IMAGEINFO value); 
    void Update(); 
    void Render(HDC hdc, RECT* prc, BITMAP bm); 

private: 

    std::map<int, std::map<int, IMAGEINFO>> object; 

}; 

extern Object objects; 

Ball.cpp

#include "Ball.h"; 

int indexPos; 

HBITMAP hbm_Ball_Image = NULL; 
HBITMAP hbm_Ball_Mask = NULL; 

IMAGEINFO ballInfo; 

void Ball(BITMAP bm, int assx, int assy) { 

    indexPos = objects.addObject(ballInfo); 

    hbm_Ball_Image = createImage((HBITMAP) BITMAP_BALL); 
    hbm_Ball_Mask = createMask((HBITMAP)BITMAP_BALL, RGB(255, 255, 255), bm); 

    GetObject(hbm_Ball_Image, sizeof(bm), &bm); 

    ballInfo.height = bm.bmHeight; 
    ballInfo.width = bm.bmWidth; 

    ballInfo.x = assx; 
    ballInfo.y = assy; 

    ballInfo.speedX = 1; 
    ballInfo.speedY = 0; 

} 

ball.h

#ifndef BALL_H 
#define BALL_H 
#endif 

#include <windows.h> 
#include <iostream> 
#include <map> 

#include "renderer.h" 
#include "resource.h" 
#include "object.h" 

void Ball(BITMAP bm, int assx, int assy); 
void render(HDC hdc, RECT* prc, BITMAP bm); 
+2

Где ваш объект 'objects' определен? – Oleg

+0

'object' - локальная переменная в вашем конструкторе. Вы не можете очистить его в деструкторе. –

+0

Взгляните на ваши заголовочные файлы, включая охранников - они ничего не делают. #endif следует перенести в конец файла, чтобы предотвратить включение кода, который он окружает, более одного раза. –

ответ

1

Добавить

Object objects; // construct an instance of the class 

до конца файла Object.cpp

+0

Спасибо, я был идиотом, хотя я не помню, чтобы это было раньше. Я запомню в следующий раз :) – Kryton