Инициализация динамически размещаемых структур с использованием общего указателя - PullRequest
1 голос
/ 11 мая 2019

Я не понимаю, почему инициализация динамически распределенной структуры должна быть сделана следующим образом (с использованием общего ptr) Просто для уведомления, что я использую C ++ 11

Если у нас есть структура, подобная этой

struct Meme {
   std::string s;
   Meme* p;
}

и позже в коде, мне нужно динамически распределять память для этой структуры, используя shared_ptr, но мне нужно сделать мгновенную инициализацию структуры.Почему это делается так?

std::shared_ptr<Meme> novi=std::make_shared<Meme>(Meme{imena.at(i),nullptr});

часть, которая меня смущает, такова:

std::make_shared<Meme>(Meme{imena.at(i),nullptr});

Если мы устанавливаем, что shared_ptr указывает на структуру Meme, почему мы должны снова указать, чтосписок инициализации предназначен для struct Meme, говоря:

(Meme{imena.at(i),nullptr})

Почему это не сработает:

std::shared_ptr<Meme> novi=std::make_shared<Meme>({imena.at(i),nullptr});

Может ли этот список инициализации не вычесть, что ему нужно преобразовать в struct Meme, потому чтонет прямого использования struct Meme (хотя make_shared указывает на struct Meme)?

1 Ответ

0 голосов
/ 11 мая 2019

make_shared пересылает аргументы в конструктор.

Make shared_ptr

Выделяет и создает объект типа T передает аргументы в свой конструктор и возвращает объект типа shared_ptr, который владеет и хранит указатель на него (с использованием счетчика 1).

Это вызывает конструктор копирования Meme из нового экземпляра, который вы создаете с помощью Meme{imena.at(i),nullptr}.

std::shared_ptr<Meme> novi=std::make_shared<Meme>(Meme{imena.at(i),nullptr});

Правильный способ построить его с помощью make_shared из переадресованных аргументов - создать конструктор в структуре:

struct Meme {
    std::string s;
    Meme* p;
    Meme(const std::string& s, Meme* p) : s(s), p(p) {}
};

std::shared_ptr<Meme> novi = std::make_shared<Meme>(imena.at(i),nullptr);

Также вы можете создать экземпляр с (по умолчанию) пустым конструктором и затем установить его члены:

struct Meme {
    std::string s;
    Meme* p = nullptr;
};

std::shared_ptr<Meme> novi = std::make_shared<Meme>;
novi->s = imena.at(i);
...