Russian Qt Forum
Ноябрь 23, 2024, 07:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: несуществующий указатель на объект вектора  (Прочитано 3259 раз)
Karl-Philipp
Гость
« : Октябрь 28, 2008, 23:55 »

Всем привет!

Допустим, есть класс с неким членом - свойством1 типа bool.
Существует вектор с указателями на объекты этого класса.
Есть также две функции В первой функции (initFunction()) вектор заполняется n-ным числом указателей на объекты со значеним свойства1 false. Во второй функции (processFunction()) вектор заполняется (дополняется) указателями на объекты со значением свойства1 true. Причем количество создаваемых указателей на объекты во второй функции должно равняться количеству уже существующих указателей на объекты в векторе.

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

VS2002

Чуть поправил условие + привожу код:
Класс:

Код:
#ifndef SOMECLASS_H
#define SOMECLASS_H

#include <vector>

using namespace std;

class SomeClass
{
public:
SomeClass();
SomeClass(bool newStatus, int newValue = 1);
~SomeClass();
void initFunction();
void processFunction();
void showVector();

private:
vector< SomeClass * > vectorSomeClass;
bool status;
int value;
};

#endif

Реализция класса:
Код:
#include "someclass.h"
#include <iostream>

SomeClass::SomeClass()
{
}

SomeClass::SomeClass(bool newStatus, int newValue)
{
status = newStatus;
value = newValue;
}

SomeClass::~SomeClass()
{
vector<SomeClass*>::iterator iteratorSomeClass = vectorSomeClass.begin();

while(iteratorSomeClass != vectorSomeClass.end())
{
SomeClass *tempObj = *iteratorSomeClass++;
delete tempObj;
}
vectorSomeClass.clear();
}

void SomeClass::initFunction()
{
for(int i = 1; i < 10; i++)
vectorSomeClass.push_back( new SomeClass( false, i ));
}

void SomeClass::processFunction()
{
vector< SomeClass * >::iterator iteratorSomeClass = vectorSomeClass.begin();

int i = 1;
while((*iteratorSomeClass)->status == false){
vectorSomeClass.push_back( new SomeClass( true, i*i ));
iteratorSomeClass++;
i++;
}
}

void SomeClass::showVector()
{
vector<SomeClass *>::iterator iteratorSomeClass = vectorSomeClass.begin();

int i = 0;
while (iteratorSomeClass != vectorSomeClass.end())
{
cout << "vector's value number " << i << " Status is " << (*iteratorSomeClass)->status << " Value is " << (*iteratorSomeClass)->value << endl;
i++;
iteratorSomeClass++;
}
}

использование класса:
Код:
#include <vector>
#include <iostream>

#include "SomeClass.h"

using namespace std;

int main()
{
SomeClass objectToTest;

objectToTest.initFunction();
objectToTest.processFunction();
objectToTest.showVector();

return 0;
}
« Последнее редактирование: Октябрь 29, 2008, 09:15 от terlan » Записан
Tonal
Гость
« Ответ #1 : Октябрь 29, 2008, 09:46 »

При изменении размеров вектора все его итераторы становятся невалидными.
Записан
Karl-Philipp
Гость
« Ответ #2 : Октябрь 29, 2008, 09:49 »

Спасибо большое, Tonal Улыбающийся
Решение: создал еще один вектор, который заполняю, перебирая объекты первого.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 21.