MSVC ++ 2010 Express链接器错误LNK2005

时间:2012-01-20 07:13:57

标签: c++ visual-studio-2010 inheritance linker

我的项目中有一些文件没有按照我希望的方式工作。

基本上,我有一个名为Entity的类。它在 Entity.h 中定义,函数在 Entity.cpp 中,因此全部膨胀。然后我有一个名为PlayerShip的子课程。它以两个文件的相同方式定义。

Entity.h 包含在 PlayerShip.h 中)

当我在 playership.cpp main.cpp 中包含 PlayerShip.h 时,链接器会抛出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

1 个答案:

答案 0 :(得分:1)

我相信你已经忘记了包括警卫或曾经使用过pragma。这些将确保只有在女孩好的时候才会读取标题。

包括警卫示例:

#ifndef ENTITY_H
#define ENTITY_H

class Entity
...

#endif // ENTITY_H

Pragma一次:

#pragma once

class Entity
...

请注意,pragma曾经不是标准的,但几乎所有编译器仍然支持。