C ++ 2D массив shared_ptr инициализируется с абстрактным полиморфным типом - PullRequest
0 голосов
/ 03 июня 2018

У меня есть полиморфный тип, который мне нужен для инициализации 2D-массива, как shared_ptr ** Карта

это мой инициализатор, когда не было shared_ptr, можете ли вы сказать мне решение для работы?Ошибка несовместимого типа указателя shared_ptr ** и Game_Object ***

Map = new shared_ptr<Game_Object>();
    for (int i = 0; i < (int) width_; i++)
        Map[i] = new shared_ptr<Game_Object>();

Map = new shared_ptr<Game_Object>(); равно shared_ptr<Game_Object>*, и мне нужно получить это "shared_ptr<Game_Object>**", как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 16 июня 2018

Я согласен с некоторым программистом чувак.Лучше оставить контейнеры для управления выделением ресурсов.

Более того, у вас может быть тот же старый встроенный 2d массив shared_ptr в куче с modern code, если вы просто знать ширину строки во время компиляции.

constexpr size_t const WIDTH = 200;

template<typename T, auto width>
using Arr2D_sptr = std::vector<std::array<std::shared_ptr<T>, width> >;

template<typename T>
auto make_row_sptr(size_t height) {
    return Arr2D_sptr<GameInvarient, WIDTH>{height};
}

int main()
{
    size_t height{100};
    auto my2d = make_row_sptr<GameInvarient>(height);
    // contagueous 2d of shared_ptr
    // and all pointed objects are already set 
    // from this point.
    // (objects are not contagueous)

    for (auto row : my2d) {
        for (auto sptr : row) {
            std::cout << sptr->x; // use object
        }
    }

    for (auto row = 0; row < height; ++row) {
        for (auto col = 0; col < WIDTH; ++col) {
            std::cout << my2d[row][col]->x; // use object
        }
    }

}

https://godbolt.org/g/czR3pZ

0 голосов
/ 03 июня 2018

мне нужно получить это shared_ptr<Game_Object>** как мне это сделать?

shared_ptr<Game_Object>** - это необработанный указатель на необработанный указатель на общий указатель на Game_Object.Зачем вам такие сложные и запутанные настройки, я не знаю.Но если вы хотите создать его, вы можете:

size_t x = 3, y = 4; // 3 x 4 2D array
std::shared_ptr<Game_Object> **arr = new std::shared_ptr<Game_Object>*[x]();
for (size_t i = 0; i < x; ++i)
    arr[i] = new std::shared_ptr<Game_Object>[y]();

Конечно, вам нужно указать значение этих общих указателей:

for (size_t i = 0; i < x; ++i)
    for (size_t j = 0; j < y; ++j)
        arr[i][j] = std::make_shared<Game_Object>(); 

И не забудьте выделить delete[]память после того, как вы сделали

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...