我需要创建一个线程来运行我游戏的网络部分。我更喜欢使用SFML线程,因为我的编译器还不支持C ++ 11线程。但是,包含该线程的类是使用make_shared()
创建的。这是代码:
Game.cpp(并非所有代码都只是GameScreen的声明)
std::shared_ptr<Screen> Game::screen = std::make_shared<GameScreen>();
Screen只是一个包含纯虚函数的基类。您应该能够根据覆盖关键字找出哪些是虚拟的。
GameScreen.h
#ifndef GAMESCREEN_H
#define GAMESCREEN_H
#include <SFML/Graphics.hpp>
#include "Events.h"
#include "Screen.h"
#include "Map.h"
#include "Network.h"
class GameScreen : public Screen
{
public:
GameScreen();
void handleInput(sf::RenderWindow&) override;
void update(sf::RenderWindow&, sf::View&) override;
void render(sf::RenderWindow&) override;
private:
Map m_map;
Network network;
Events eventManager;
sf::Thread networkThread;
};
#endif // GAMESCREEN_H
GameScreen.cpp
#include <memory>
#include <iostream>
#include "GameScreen.h"
#include "Game.h"
GameScreen::GameScreen()
: networkThread(network.receive(eventManager))
{
network.Connect();
}
void GameScreen::handleInput(sf::RenderWindow& window)
{
/*Code*/
}
void GameScreen::update(sf::RenderWindow& window, sf::View& view)
{
/*Code*/
}
void GameScreen::render(sf::RenderWindow& window)
{
/*Code*/
}
Network.cpp(仅限接收功能)
void Network::Recieve(Events& eManager)
{
sf::Packet m_rPacket;
m_socket.receive(m_rPacket, m_serverIP, port);
m_rPacket >> /*Data*/
eManager.addEvent(tmp);
}
答案 0 :(得分:1)
您可以在构造函数的初始化列表中使用this
:
MyClass::MyClass()
: AClass(&MyFunction(*this))
{
/*do stuff*/
}
但是,这在您的示例中没有意义,因为您尝试将指向MyFunction
(或其不存在的返回值)的指针传递给AClass()
,而您不能品质带参数的指针。实际上调用 MyFunction()
时,您只能将参数传递给MyFunction()
。你确定你实际上并不是指这样的东西:
MyClass::MyClass()
: AClass()
{
/*do stuff*/
MyFunction(*this);
}
如果没有看到AClass()
实际上是什么,或者预期输入是什么,就很难确定你想要做什么。
更新显然您没有在线程上阅读SFML documentation或SFML Tutorial。 Thread
构造函数将指向函数/方法的指针作为一个输入参数,将函数/方法的可选输入值作为单独的参数。试试这个:
class MyClass : public sf::Thread
{
private:
static void MyFunction(MyClass &cls);
public:
MyClass();
};
MyClass::MyClass()
: sf::Thread(&MyClass::MyFunction, *this)
{
/*do stuff*/
}
void MyClass::MyFunction(MyClass &cls)
{
/*do stuff with 'cls'*/
}
或者这个,因为可以使用带有SFML线程的非静态类方法:
class MyClass : public sf::Thread
{
private:
void MyFunction();
public:
MyClass();
};
MyClass::MyClass()
: sf::Thread(&MyClass::MyFunction, *this)
{
/*do stuff*/
}
void MyClass::MyFunction()
{
/*do stuff with 'this'*/
}
更新:根据您的新代码,您仍然无法正确构建sf::Thread
对象(您是否阅读了我链接到的文档/教程?)。此外,您的线程需要访问GameScreen
拥有的多个对象,因此您无法将它们全部传递给sf::Thread
构造函数。你需要做更多这样的事情:
class GameScreen : public Screen
{
public:
GameScreen();
...
private:
...
Network network;
Events eventManager;
sf::Thread networkThread;
void networkThreadFunc();
};
GameScreen::GameScreen()
: networkThread(&GameScreen::networkThreadFunc, *this)
{
network.Connect();
}
void GameScreen::networkThreadFunc()
{
network.Receive(eventManager);
}