Ошибка компоновщика MSVC ++ 2010 Express LNK2005 - PullRequest
0 голосов
/ 20 января 2012

У меня есть несколько файлов в моем проекте, которые работают не так, как я хочу.

По сути, у меня есть класс, называемый Entity.Он определен в Entity.h , а функции - в Entity.cpp , так что все отлично.Затем у меня есть дочерний класс, который называется PlayerShip.Он определяется одинаково, в двух файлах.

( Entity.h включен в PlayerShip.h )

Когда я включаю PlayerShip.h в Playership.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

1 Ответ

1 голос
/ 20 января 2012

Я полагаю, что вы забыли включить охранников или один раз использовать прагму.Это гарантирует, что заголовок будет прочитан только тогда, когда это хорошо.

Включите пример охраны:

#ifndef ENTITY_H
#define ENTITY_H

class Entity
...

#endif // ENTITY_H

Прагма один раз:

#pragma once

class Entity
...

Обратите внимание, что прагмакогда-то не является стандартным, но все еще поддерживается практически всеми компиляторами.

...