Разыменование итератора в указателях правильно

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

В конечном итоге предполагается, что эта функция записывает число в файл, но я использую cout для тестирования.

    void writeNumbers(vector<Integer*>& input)
{
ofstream write;
write.open("Integers.txt");
vector<Integer*>::iterator iter = input.begin();
for (iter; iter < input.end(); iter++)
{
**std::cout << (*iter)->toString() << std::endl;**
}
write.close();

I get an Access Violation error which points me to the toString() function:

std::string Integer::toString()
{
std::stringstream ss;
ss << *(this)->value;
return ss.str();
}

toString() works fine whenever I don't try to access it through the iterator.

Редактировать: значение в toString на самом деле является указателем на число.

Edit2: новые записиNumbers:

void writeNumbers(vector<Integer*>& input)
{
ofstream write;
write.open("Integers.txt");
vector<Integer*>::iterator iter = input.begin();
for (iter; iter != input.end(); iter++)
{
std::cout << (*iter)->toString() << std::endl;
}
write.close();
}

Окончательное редактированиеЛадно, проблема оказалась в том, что конструктор с ошибками не смог должным образом инициализировать указатель, так что я был ОЧЕНЬ неуверен в том, где на самом деле была проблема. 🙂

Integer::Integer(string input)
{
if(isNaN(input))
value = new int(atoi(input.c_str()));
}

Так что должен был! isNaN, плюс я исправил проблему инициализации на неверном вводе:

//New constructor, works 100%
Integer::Integer(string input)
{
if(!isNaN(input))
value = new int(atoi(input.c_str()));
else
value = new int(0);
}

1

Решение

Ваш toSting () имеет проблему. + Изменить

ss <<*(this)->value;

в

ss << value;
2

Другие решения

РЕДАКТИРОВАТЬ: Это не ошибка, а общий совет при использовании итераторов. Не использовать < чтобы проверить конец, используйте !=,

iter < input.end()

Должно быть так:

iter != input.end()

Это связано с тем, что для определенных контейнеров < Оператор не будет делать то, что вы ожидаете. В результате, в какой-то момент вы можете разыменовать сам input.end (), который ни на что не указывает.

0

По вопросам рекламы [email protected]