C++. название класса из строки

145
11 марта 2018, 23:29
#pragma once
#include "World\TileObject.h"
#include <memory>
#include "World\Dungeon_Floor_1.h"
class Cell
    //участок на уровне (базовый тайл (пол, стена итп), на котором лежат предметы и имеет координаты итп)
{private:
    unsigned int x_coord, y_coord;
    TileObject* _baseTile; //основной тайл клетки - пол, стена, вода итп
public:
    Cell(unsigned int x, unsigned int y, const std::string& objectname);
    ~Cell();
    Cell(const Cell &obj);
    void draw(sf::RenderTarget & window);
};
/////////////////////////////////////////////////
#include "Cell.h"
Cell::Cell(unsigned int x, unsigned int y, const std::string& objectname): x_coord(x), y_coord(y)
{
    if (objectname == "Dungeon_Floor_1") {
        _baseTile = new Dungeon_Floor_1();
    }
}

Cell::~Cell()
{
    delete _baseTile;
}
Cell::Cell(const Cell & obj)
{   x_coord = obj.x_coord;
    y_coord = obj.y_coord;
    _baseTile = obj._baseTile;}

Вот здесь

if (objectname == "Dungeon_Floor_1") {    
            _baseTile = new Dungeon_Floor_1();
        }

создается объект, отвечающий за определенный объект в игре через полиморфизм базового объекта. Это просто тест, можно ли мне как-нибудь преобразовывать строку "Dungeon_Floor_1"(которая в проверке) в название класса (new Dungeon_Floor_1()), чтобы избавиться от проверок, так как таких разных классов как Dungeon_Floor_1 будет мильон?

Answer 1

Допустим у вас есть классы

class  TileObject  {...};
class D_F_1 : public  TileObject {...};
class D_F_2 : public   TileObject {...};
class D_F_3 : public   D_F_2  {...};
...

тогда создайте таблицу обьектов с их именами

std::unordered_map<string, TileObject*> table;
    table["D_F_1"] = new D_F_1;
    table["D_F_2"] = new D_F_2;
    table["D_F_3"] = new D_F_3;
 ...

тогда вы можете записать

 _baseTile = table[objectname];

вместо:

  if (objectname == "Dungeon_Floor_1") {
        _baseTile = new Dungeon_Floor_1();
    }
READ ALSO
Контроль регистра первого символа в QLineEdit

Контроль регистра первого символа в QLineEdit

Нужно в форму LineEdit ввести текст, который обязательно должен начинаться с заглавной буквы

133
С++ Задача на спички

С++ Задача на спички

Есть задача на C++Задачу вроде решил правильно, ответы выводит нужные, но когда загружаю решение пишет ошибку

229
Что означает параметр tcpi_rcv_rtt в структуре tcp_info?

Что означает параметр tcpi_rcv_rtt в структуре tcp_info?

В структуре tcp_info описаны вот такие параметры, описывающие RTT:

159