использование unique_ptr в конструкторе - PullRequest
0 голосов
/ 31 августа 2018

Я работаю над школьным проектом и не могу понять, как использовать unique_ptr.

class ClassName
{
private: 
    unique_ptr <bool[]> uniquePtr;

    void func(unique_ptr<bool[]>& refPtr) const
        {
            refPtr[0] = true;
            refPtr[1] = false; 
        }
public:
    //other things that will use the array uniquePtr
};

ClassName::ClassName()
{
    bool* boolName = new bool [someSize()];
    uniquePtr = unique_ptr<bool[]>(boolName);
    func(uniquePtr);
    for(int i =0; i<someSize(); i++)
        {
            cout << uniquePtr[i];
            //This is all O's
        }
}

Это не работает, потому что uniquePtr устанавливается на все 0 в конце функции func (). Я не могу понять, как изменить uniquePtr так, чтобы он был доступен для других моих функций. Я не пытался создать новый unique_ptr для перехода в func (), а затем использовать move (uniquePtr), но он даже не скомпилируется.

Если uniquePtr передается функцией, в этом случае присваивая ей логическое значение 1 или 0, должен ли он быть доступным для функции, выходящей за пределы класса? Если я печатаю uniquePtr [index] внутри функции, это дает ожидаемые результаты.

Спасибо за помощь!

1 Ответ

0 голосов
/ 31 августа 2018

A unique_ptr не уничтожается при передаче его функции по ссылке , так что вы в безопасности здесь.

Однако передача unique_ptr по ссылке может быть не лучшим способом выразить идею. Несобственный указатель представлен простым указателем в стиле C в C ++, так что это безопасно и идиоматично:

void func(bool (*ptr)[]) const { ...

, а затем

func(uniquePtr.get());

Как уже упоминалось в комментариях, элементы данных должны быть инициализированы следующим образом:

ClassName::ClassName() : unique_ptr(new bool[someSize()]) {
    func(uniquePtr.get());
}

(используйте std::make_unique вместо new, если можете)

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