我一直在阅读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>
任何帮助都将不胜感激。
答案 0 :(得分:0)
我假设你在同一个项目中有两个类。 链接器消息告诉您链接器找不到拟合函数定义。 所以我的猜测是......链接器无法找到函数的拟合重载。 &#34;新游戏&#34;是一个const char *,它不是一个std :: string。
a)将您的方法签名更改为
void ButtonInit(const char* name);
或 b)称你的方法如下:
button_play.ButtonInit(std::string("new-game"));