Last active
June 4, 2020 14:38
-
-
Save AlexandreGerault/dbdfe96fe9e07a0cb933149aaf694ea5 to your computer and use it in GitHub Desktop.
Error with abstract type & factory
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Dans le fichier inclus depuis /run/media/alexandre-gerault/Seagate Expansion Drive/Programming/C++/werewolf/server_lib/include/rooms/server_rooms.hpp:7, | |
depuis /run/media/alexandre-gerault/Seagate Expansion Drive/Programming/C++/werewolf/server_lib/src/rooms/server_rooms.cpp:1: | |
/run/media/alexandre-gerault/Seagate Expansion Drive/Programming/C++/werewolf/server_lib/include/utils/factory.hpp: Dans l'instanciation de « class ww::factory<ww::room_interface> » : | |
/run/media/alexandre-gerault/Seagate Expansion Drive/Programming/C++/werewolf/server_lib/include/rooms/server_rooms.hpp:28:33: requis depuis ici | |
/run/media/alexandre-gerault/Seagate Expansion Drive/Programming/C++/werewolf/server_lib/include/utils/factory.hpp:22:16: erreur: le type abstrait « ww::room_interface » retourné est invalide | |
22 | Object make(std::string const &key, Args &&... args) const { | |
| ^~~~ | |
Dans le fichier inclus depuis /run/media/alexandre-gerault/Seagate Expansion Drive/Programming/C++/werewolf/server_lib/include/rooms/server_rooms.hpp:6, | |
depuis /run/media/alexandre-gerault/Seagate Expansion Drive/Programming/C++/werewolf/server_lib/src/rooms/server_rooms.cpp:1: | |
/run/media/alexandre-gerault/Seagate Expansion Drive/Programming/C++/werewolf/server_lib/include/rooms/room_interface.hpp:11:11: note: parce que les fonctions virtuelles suivantes sont pures dans « ww::room_interface »: | |
11 | class room_interface { | |
| ^~~~~~~~~~~~~~ | |
/run/media/alexandre-gerault/Seagate Expansion Drive/Programming/C++/werewolf/server_lib/include/rooms/room_interface.hpp:16:22: note: « virtual void ww::room_interface::start() » | |
16 | virtual void start() = 0; | |
| ^~~~~ | |
/run/media/alexandre-gerault/Seagate Expansion Drive/Programming/C++/werewolf/server_lib/src/rooms/room_interface.cpp:6:32: erreur: définition de « ww::room_interface::room_interface() » explicitement par défaut | |
6 | room_interface::room_interface() { | |
| ^ | |
Dans le fichier inclus depuis /run/media/alexandre-gerault/Seagate Expansion Drive/Programming/C++/werewolf/server_lib/src/rooms/room_interface.cpp:1: | |
/run/media/alexandre-gerault/Seagate Expansion Drive/Programming/C++/werewolf/server_lib/include/rooms/room_interface.hpp:14:9: note: « ww::room_interface::room_interface() » explicitement par défaut ici | |
14 | room_interface() = default; | |
| ^~~~~~~~~~~~~~ | |
Dans le fichier inclus depuis /run/media/alexandre-gerault/Seagate Expansion Drive/Programming/C++/werewolf/server_lib/src/rooms/server_rooms.cpp:1: | |
/run/media/alexandre-gerault/Seagate Expansion Drive/Programming/C++/werewolf/server_lib/include/rooms/server_rooms.hpp: Dans la fonction membre « void ww::server_rooms::create_room(const string&, Args&& ...) »: | |
/run/media/alexandre-gerault/Seagate Expansion Drive/Programming/C++/werewolf/server_lib/include/rooms/server_rooms.hpp:16:58: erreur: « class ww::factory<ww::room_interface> » n'a pas de membre nommé « make » | |
16 | m_rooms.insert(m_rooms.end(), m_room_factory.make(type, args...)); | |
| ^~~~ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef WEREWOLF_ROOM_FACTORY_HPP | |
#define WEREWOLF_ROOM_FACTORY_HPP | |
#include <functional> | |
#include <memory> | |
#include <rooms/room_interface.hpp> | |
#include <string> | |
#include <unordered_map> | |
namespace ww { | |
template<class Object, class... Args> | |
class factory { | |
public: | |
using Creator = std::function<std::unique_ptr<Object(Args...)>>; | |
void registers(std::string const &key, Creator const &creator) { | |
m_registry.emplace(key, creator); | |
} | |
std::unique_ptr<Object> make(std::string const &key, Args &&... args) const { | |
return m_registry[key](std::forward<Args>(args)...); | |
} | |
private: | |
std::unordered_map<std::string, Creator> m_registry; | |
}; | |
}// namespace ww | |
#endif//WEREWOLF_ROOM_FACTORY_HPP |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef WEREWOLF_ROOM_INTERFACE_HPP | |
#define WEREWOLF_ROOM_INTERFACE_HPP | |
#include <core/configuration.hpp> | |
#include <string> | |
namespace ww { | |
enum class room_state { lobby, | |
in_progress }; | |
class room_interface { | |
public: | |
room_interface() = delete; | |
explicit room_interface(const std::string &name); | |
virtual void start() = 0; | |
private: | |
configuration m_config; | |
room_state m_state; | |
std::string m_name; | |
}; | |
}// namespace ww | |
#endif// WEREWOLF_ROOM_INTERFACE_HPP |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "rooms/server_rooms.hpp" | |
#include <rooms/text_room.hpp> | |
#include <rooms/voice_room.hpp> | |
using namespace ww; | |
server_rooms::server_rooms() { | |
// TODO: Load rooms from files (serialization) | |
initFactory(); | |
} | |
void server_rooms::initFactory() { | |
m_room_factory.registers("text_room", [](std::string const& name) { return std::make_unique<text_room>(name); }); | |
m_room_factory.registers("voice_room", [](std::string const& name) { return std::make_unique<voice_room>(name); }); | |
} | |
void server_rooms::delete_room(const room_interface &room) { | |
m_rooms.remove(room); | |
} | |
void server_rooms::remove_room(const room_interface &room) { | |
m_removed_rooms.insert(m_removed_rooms.end(), room); | |
m_rooms.remove(room); | |
} | |
void server_rooms::restore_room(const room_interface &room) { | |
m_rooms.insert(m_removed_rooms.end(), room); | |
m_removed_rooms.remove(room); | |
} | |
std::list<room_interface> server_rooms::list_rooms() const { | |
return m_rooms; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef WEREWOLF_SERVER_ROOMS_HPP | |
#define WEREWOLF_SERVER_ROOMS_HPP | |
#include <list> | |
#include <memory> | |
#include <rooms/room_interface.hpp> | |
#include <utils/factory.hpp> | |
namespace ww { | |
class server_rooms { | |
public: | |
server_rooms(); | |
template<class... Args> | |
void create_room(std::string const &type, Args &&... args) { | |
m_rooms.insert(m_rooms.end(), m_room_factory.make(type, args...)); | |
} | |
void delete_room(room_interface const &room); | |
void remove_room(room_interface const &room); | |
void restore_room(room_interface const &room); | |
std::list<room_interface> list_rooms() const; | |
private: | |
void initFactory(); | |
std::list<room_interface> m_rooms; | |
std::list<room_interface> m_removed_rooms; | |
factory<room_interface> m_room_factory; | |
}; | |
}// namespace ww | |
#endif//WEREWOLF_SERVER_ROOMS_HPP |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <rooms/voice_room.hpp> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment