Russian Qt Forum

Программирование => С/C++ => Тема начата: Karl-Philipp от Октябрь 28, 2008, 23:55



Название: несуществующий указатель на объект вектора
Отправлено: 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;
}


Название: Re: несуществующий указатель на объект вектора
Отправлено: Tonal от Октябрь 29, 2008, 09:46
При изменении размеров вектора все его итераторы становятся невалидными.


Название: Re: несуществующий указатель на объект вектора
Отправлено: Karl-Philipp от Октябрь 29, 2008, 09:49
Спасибо большое, Tonal :)
Решение: создал еще один вектор, который заполняю, перебирая объекты первого.