错误LNK2019:未解析的外部符号“public:void __thiscall Button :: ButtonInit”

时间:2015-03-24 15:32:02

标签: c++ function class sfml

我一直在阅读C ++ / SFML教程(http://www.gamefromscratch.com/page/Game-From-Scratch-CPP-Edition.aspx),并且已经到了最后,开始更改代码以尝试各种各样的事情,并且使用C ++和SFML更加舒适。

对于菜单屏幕,我决定为按钮创建一个对象。为此,我创建了Button.cpp和Button.h,然后链接到MainMenu.h文件中的Button.h。我添加了Button button_play作为MainMenu类的公共成员,但是当我调用Button函数时(例如:button_play.ButtonInit("new-game");),我收到错误:error LNK2019: unresolved external symbol "public: void __thiscall Button::ButtonInit(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?ButtonInit@Button@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "public: enum MainMenu::MenuResult __thiscall MainMenu::Show(class sf::RenderWindow &)" (?Show@MainMenu@@QAE?AW4MenuResult@1@AAVRenderWindow@sf@@@Z)

我已经做了很多搜索,并且我发现的大多数答案都围绕着没有正确实现类成员函数,但据我所知,我正在正确地执行它。然而,我对C ++来说是一个新手,所以我可能只是遗漏了一些东西。

这是我的代码:

MainMenu.h

#pragma once
#include "SFML\Window.hpp"
#include "SFML\Graphics.hpp"
#include "GameObjectManager.h"
#include "Button.h"
#include <list>

class MainMenu
{

public:

MainMenu(){};
~MainMenu() {};
enum MenuResult { Nothing, Exit, Play };

const static GameObjectManager& GetGameObjectManager();

struct MenuItem
    {
    public:
        sf::Rect<int> rect;
        MenuResult action;
    };

MenuResult Show(sf::RenderWindow& window);

static GameObjectManager _gameObjectManager;

Button button_play;

private:
MenuResult GetMenuResponse(sf::RenderWindow& window);
MenuResult HandleClick(int x, int y);
std::list<MenuItem> _menuItems;
};

MainMenu.cpp(这很长;我只包含调用ButtonInit()的函数和Show()返回的函数 - 如果你需要看到更多,请告诉我,我可以包括其余的这个文件的代码)

#include "stdafx.h"
#include "MainMenu.h"
#include "ServiceLocator.h"
#include "Button.h"

MainMenu::MenuResult MainMenu::Show(sf::RenderWindow& window)
{

button_play.ButtonInit("new-game");

return GetMenuResponse(window);
}



MainMenu::MenuResult  MainMenu::GetMenuResponse(sf::RenderWindow& window)
{
sf::Event menuEvent;

while(42 != 43)
{

    while(window.pollEvent(menuEvent))
    {
        if(menuEvent.type == sf::Event::MouseMoved)
        {
            button_play.Update(window);
        }
        if(menuEvent.type == sf::Event::MouseButtonPressed)
        {
            if(ServiceLocator::GetAudio()->IsSongPlaying())
            {
                ServiceLocator::GetAudio()->StopAllSounds();
            }

            return HandleClick(menuEvent.mouseButton.x,menuEvent.mouseButton.y);
        }
        if(menuEvent.type == sf::Event::Closed)
        {
            return Exit;
        }
    }
}
}

Button.h

#pragma once

class Button
{
public:
Button() {};
~Button() {};

void ButtonInit(std::string name);
void Update(sf::RenderWindow & rw);

};

Button.cpp

#include "StdAfx.h"
#include "Button.h"

void Button::ButtonInit(std::string name)
{
}

void Button::Update(sf::RenderWindow & rw)
{
}

stdafx.h(可能不需要看到这个,但以防万一)

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>

// TODO: reference additional headers your program requires here
#include <SFML/System.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/Audio.hpp>

#include <map>
#include <iostream>
#include <cassert>
#include <string>

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我假设你在同一个项目中有两个类。 链接器消息告诉您链接器找不到拟合函数定义。 所以我的猜测是......链接器无法找到函数的拟合重载。 &#34;新游戏&#34;是一个const char *,它不是一个std :: string。

a)将您的方法签名更改为

void ButtonInit(const char* name);

或 b)称你的方法如下:

button_play.ButtonInit(std::string("new-game"));