Как перейти к следующему указателю в массиве интеллектуальных указателей - PullRequest
0 голосов
/ 05 октября 2019

Я пытался выяснить, как массивы Smart Pointer работают с тестовой программой, предназначенной для чтения в файле по одному символу за раз и сохранения каждого символа по указателю в указанном массиве. Однако у меня возникли проблемы с увеличением указателя, чтобы установить более поздние переменные массива. Хотя без умных указателей я мог бы просто напечатать, например,

char *check = new char[length];
for (int i =0; i < length; i++);{
    *check=='a';
    check++;
}

, и это позволило бы мне присвоить значение каждому указателю в массиве указателей, делая то же самое с массивом умных указателей, что приводит кследующая ошибка в строке 'check ++',

//This is the smart pointer I've been using, for reference;
std::shared_ptr<char> right(new char(length));
error: no 'operator++(int)' declared for postfix '++' [-fpermissive]

На мгновение давайте забудем, что скобочная запись не существует (она работает, но я хочу знать, как это сделатьэто в обозначении указателя), поэтому я могу увеличить или получить доступ к будущим указателям надежным способом, чтобы я мог использовать его в таких вещах, как циклы для ввода значений в каждом указателе массива интеллектуальных указателей.

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

std::shared_ptr<char> - указатель на один символ. Когда разделяемый указатель будет уничтожен, он будет вызывать delete для своего указателя, а не delete [].

. Вы можете использовать std::shared_ptr<char[]>, тогда вы можете позволить этому указателю содержать массив символов.

Это, однако, неправильный инструмент для работы (если вы не работаете с устаревшим кодом или оборачиваете что-то, что использует необработанные указатели для массивов). То, что вы хотите использовать, - это std::vector<char>, который представляет собой динамический массив для символов с отвлеченным управлением памятью.

Это то, как вы будете использовать его в цикле, не совсем уверенный, почему вы не хотитеиспользовать обозначение в скобках, так как это инструмент для работы здесь.

#include <memory>
#include <iostream>

int main() {
    std::unique_ptr<char[]> ptr(new char[10]);

    for (int i=0; i<10; ++i)
        ptr[i]='a'+i;

    for (int i=0; i<10; ++i)
        std::cout << ptr[i] << ' ';
}

Лучшим вариантом IMO является использование вместо std::vector<char> ptr(10);

0 голосов
/ 05 октября 2019

shared_ptr не поддерживает арифметические операции. Цель shared_ptr - управлять временем жизни принадлежащего ему указателя.

Когда вы указываете на массив и используете оператор [], вы индексируете массив.

...