Skip to content

Instantly share code, notes, and snippets.

@AlexandreGerault
Last active June 4, 2020 14:38
Show Gist options
  • Save AlexandreGerault/dbdfe96fe9e07a0cb933149aaf694ea5 to your computer and use it in GitHub Desktop.
Save AlexandreGerault/dbdfe96fe9e07a0cb933149aaf694ea5 to your computer and use it in GitHub Desktop.
Error with abstract type & factory
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...));
| ^~~~
#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
#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
#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;
}
#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
#include <rooms/voice_room.hpp>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment