2014-11-10 3 views
-2

программы дробления, когда я пытаюсь изменить переменную класса , например:Попытка изменить значение переменной класса

class ITask 
{ 
public: 
ITask(); 
void perform(int,int); 
private: 
int total = 0; 
} 
__________implementation___________ 
void ITask::perform(int a,int b) 
{ 
int time=rand()%10; 
this->total=time; 
} 

Без строки this->total=time; программа работает.

+0

Проблема в другом месте ... – ravi

+3

У вас есть недопустимый указатель на 'ITask', и вы вызываете функцию, используя это. – molbdnilo

+0

Проблема не воспроизводится с опубликованным кодом. Пожалуйста, напишите полный пример. –

ответ

3

Как вы сказали, вы используете ITask* task; task->perform(a,b);. Однако ITask* task; только объявляет указатель на ITask, он не создает экземпляр. Итак, ваша функция-член perform пытается записать в ячейку памяти, где думает total, но на самом деле память не выделена для этой цели. Следовательно, сбой, который зависит от наличия линии this->total=time;. Обратите внимание, однако, что тот факт, что он работает без этой строки, является чисто реализацией, поскольку по-прежнему не определено поведение для вызова нестатической функции-члена без экземпляра, то есть без действительного указателя this.

Либо использовать

ITask task; 
task.perform(a,b); 

(чтобы создать ITask локальной для функции) или

ITask* task = new ITask(); 
task->perform(a,b); 
//later deallocate: 
delete task; 

(создать ITask, который живет, пока вы не вызовете delete). Оба создают реальные объекты.

Смежные вопросы