2012-01-20 82 views
0

我的項目中有幾個文件無法按照我希望的方式工作。MSVC++ 2010快速鏈接器錯誤LNK2005

基本上,我有一個類,稱爲實體。它在Entity.h中定義,功能在Entity.cpp,所以這一切都是膨脹的。然後我有一個叫做PlayerShip的小孩課。它在兩個文件中以相同的方式定義。

Entity.h包含PlayerShip.h

當我包括PlayerShip.hplayership.cpp並在main.cpp中接頭拋出一個LNK2005錯誤 - 構造函數被定義兩次。不過技術上來說,它不是隻是原型兩次?

的main.cpp

-- snip -- 

#include "PlayerShip.h" 
using namespace std; 

-- snip -- 

// PLAYER 
int playerFlags = DRAW | EVENT | LOGIC; 
playerShip pship = playerShip(playerFlags, iManager.getImage("ship.png"), 4); 
Entity* player = eManager.addEntity(&pship); 

etc, int main() yada yada yada 

PlayerShip.h

#include "entity.h" 

class playerShip : public Entity 
{ 
private: 
    int horizontalSpeed, verticalSpeed; 
    int moveSpeed; 

public: 
    playerShip(int allow, const sf::Image &img, int speed); 
    void handleLogic(); 
    void handleEvents(sf::Event ev, sf::RenderWindow *screen); 
}; 

playership.cpp

#include "PlayerShip.h" 

playerShip::playerShip(int allow, const sf::Image &img, int speed) : Entity(allow, img), horizontalSpeed(0), verticalSpeed(0) 
{ 
moveSpeed = speed; 
} 

void playerShip::handleEvents(sf::Event ev, sf::RenderWindow *screen) 
{ 
while (screen->GetEvent(ev)) 
{ 
    if (ev.Type == sf::Event::KeyPressed) 
    { 
     if (ev.Key.Code == sf::Key::Left) 
      horizontalSpeed = -1 * moveSpeed; 
     if (ev.Key.Code == sf::Key::Right) 
      horizontalSpeed = 1 * moveSpeed; 
     if (ev.Key.Code == sf::Key::Up) 
      verticalSpeed = -1 * moveSpeed; 
     if (ev.Key.Code == sf::Key::Down) 
      verticalSpeed = 1 * moveSpeed; 
    } 
} 
} 

void playerShip::handleLogic() 
{ 
setX(float(getX()+horizontalSpeed)); 
setY(float(getY()+verticalSpeed)); 
} 

我不知道爲什麼會發生這種情況。 = S

+2

你還在''main.cpp'中包含'#include entity.h'嗎? – lapk

+4

@user你能發佈確切的鏈接器錯誤信息嗎? – Mahesh

+1

如果在main.cpp中同時包含「PlayerShip.h」和「Entity.h」,則必須使用[include guard](http://en.wikipedia.org/wiki/Include_guard)來保護頭文件。 –

回答

1

我相信你忘記了包括警衛或使用編譯指示一次。這些將確保頭只會被讀取一次女巫是好的。

包括後衛例如:

#ifndef ENTITY_H 
#define ENTITY_H 

class Entity 
... 

#endif // ENTITY_H 

附註一次:

#pragma once 

class Entity 
... 

注意,一旦附註不標準,但仍然被幾乎所有的編譯器的支持。

+0

我使用包括警衛。 – user981643

+0

在這種情況下,我真的不知道它有什麼問題...也許看到實體類看起來可能會幫助或鏈接器錯誤本身(儘管我懷疑這會有多大的幫助)...有時也沒有什麼錯誤的代碼和VS只是錯了。唯一的解決辦法就是重建... –