编辑:解决了!使用πάνταῥεῖ和molbdnilo的建议我将类定义放在头文件中,并将我的对象声明为指针。我还通过main.cpp底部的“kc-> move(text)”取消引用指针。我最后还将文本作为参考传递,以便当窗口在main.cpp下更新时,控制器对其进行的任何更改都会坚持使用。 的 /修改
我试图使用C ++在VS2010中创建一个简单的流氓式游戏。与此同时,我希望将我正在学习的OOP概念纳入其中(使用多个互联网资源进行自学)。
我遇到问题的概念是实现接口(我读过的不是c ++的东西,但无论如何都可以这样做)。我的想法是为控制器创建一个接口,其中KeyboardController是一个控制器和GamepadController(即将推出!)是一个控制器。
在main.cpp中我包含了我的控制器接口的头文件(抽象类?)。我还尝试使用“KeyboardController kc”进行声明;哪个错误的KeyboardController是未定义的。然后我尝试了“MyController kc = new KeyboardController();”基于搜索其他问题并盲目地尝试修复没有好结果(我也不认为这会起作用,因为MyController不应该是具体的,我得到的错误证实了这一点。)
正如我在上面暗示的那样,我已经阅读了数十个“标识符'X'未定义”的帖子,但大多数问题似乎来自不正确(无人看守或冗余)的问题。
以下是我决定在我用尽之前将其保留的代码。
的main.cpp
#include <SFML/Graphics.hpp>
#include "mycontroller.h"
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML works!");
// declaring my class
MyController kc = new KeyboardController();
// KeyboardController kc;
sf::Text text, hud;
sf::Font font;
if (!font.loadFromFile("arial.ttf"))
{
// error...
}
text.setFont(font);
hud.setFont(font);
text.setString("X");
hud.setString("You wake up in a black void.");
text.setCharacterSize(12);
text.setColor(sf::Color::White);
text.setStyle(sf::Text::Bold);
text.setPosition(400, 300);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
// check the type of the event...
switch (event.type)
{
// window closed
case sf::Event::Closed:
window.close();
break;
// key pressed
case sf::Event::KeyPressed:
kc.move(text); // using method from my declared class
...
mycontroller.h (我在这里已经注释掉了KeyboardController,因为我相信它会进入下一个文件.cpp以及构造函数)
#ifndef MyController_H
#define MyController_H
/* This header file is to create an interface for my controllers */
class MyController {
public:
// MyController(){}
virtual ~MyController(){}
virtual void move(sf::Text player) = 0;
};
/*
class KeyboardController : public MyController{
public:
// KeyboardController(){}
~KeyboardController()
virtual void move(sf::Text player);
};
*/
#endif
mycontroller.cpp
#include <SFML/Graphics.hpp>
#include "mycontroller.h"
/* This file is where I intend to instantiate my concrete controllers */
class KeyboardController : public MyController{
public:
// KeyboardController();
~KeyboardController();
virtual void move(sf::Text player);
};
/*
KeyboardController::KeyboardController()
{
}
*/
KeyboardController::~KeyboardController()
{
}
void KeyboardController::move(sf::Text player)
{
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
player.move(-4, 0);
}
}
感谢您花时间阅读本文!非常感谢任何帮助。