#include <vcl.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
template <class T> class Collection
{
private:
int current_size; //текущий размер коллекции
int max_size; //максимальный размер коллекции
T *obj; //массив объектов коллекции
long N_comparison;
long N_exchange;
public:
Collection ( ); //конструктор по умолчанию
//Collection (…); //конструктор с параметрами
Collection (const Collection<T> & anotherCollection); // конструктор копирования
~Collection (); //деструктор
//объявление прототипов интерфейсных методов Collection
int size_of_vektor(); //опрос размера вектора ============== READY!========
void resize(int); //изменение размера вектора ============== READY!========
void random_input(); //заполнение вектора случайными величинами
void ranked_input(); //заполнение вектора упорядоченным набором
void manual_input(); //ввод вектора с клавиатуры ============== READY!========
void term_output(); //вывод вектора на экран
T read_N(int); //чтение по индексу ============== READY!========
void write_N(int,T); //запись по индексу ============== READY!========
//сортировки:
void Bubble_sort();
void MSD_sort();
long get_N_comparison();
long get_N_exchange();
//класс итератора для объекта Collection
class Iterator
{ Collection *ptr; //указатель на объект коллекции
T *cur; //указатель на текущий элемент коллекции
public:
Iterator (Collection *); //конструктор итератора
~Iterator(); //деструктор итератора
void beg(); //установка итератора на первый элемент коллекции
void end(); //установка итератора на последний элемент коллекции
void next(); //перевод итератора на следующий элемент
void prev(); //перевод итератора на предыдущий элемент
bool is_off(); //проверка выхода итератора за пределы коллекции
// Т& operator *(); //доступ к данным текущего элемента
//необязательные методы итератора
// Iterator &operator ++(); //оператор инкремента итератора
// Iterator & operator --(); //оператор декремента итератора
// bool opereator ==(const Iterator &); //оператор сравнения итераторов
// Iterator & operator =( const Iterator &); //оператор присваивания
}; //конец класса Iterator
friend class Iterator;
}; //конец класса Collection
//реализация методов класса Collection
//контруктор по умолчанию (===============ИЗМЕНИТЬ!!!!!!==============)
template <class T> Collection <T>::Collection () :
current_size (5),
max_size (10),
N_comparison (0),
N_exchange (0)
{
obj=new T;
}
//деструктор
template <class T> Collection <T>::~Collection ()
{delete obj; }
//опрос размера вектора
template <class T> int Collection <T>::size_of_vektor ()
{ return current_size; }
//чтение по индексу
template <class T> T Collection <T>:: read_N (int N)
{
while (N < 0 || N > current_size) do
{
cout << "Enter correct index: " ;
cin >> N;
};
return obj[N];
}
//запись по индексу
template <class T> void Collection <T>:: write_N (int N,T new_item)
{
while (N < 0 || N > current_size) do
{
cout << "Enter correct index: " ;
cin >> N;
};
obj[N]=new_item;
}
//изменение размера вектора
template <class T> void Collection <T>:: resize (int N)
{
while (N < 0 || N > max_size) do
{
cout << "Enter correct new size: " ;
cin >> N;
};
current_size=N ;
}
//ввод вектора с клавиатуры
template <class T> void Collection <T>:: manual_input ()
{
for (int i = 0 ; i < current_size ; i++)
{
cout << "Enter " << i << " element:";
//cin >> obj;
obj=i*2;
}
}
//вывод вектора на экран
template <class T> void Collection <T>:: term_output ()
{
for (int i = 0 ; i < current_size ; i++)
{
cout << obj << "--";
}
}
//реализация методов класса Iterator.
//конец заголовочного файла "Collection.h"
ошибка Project kontr1_pr.exe raised exception class EAccessViolation ...
Project kontr1_pr.exe raised exception class EAccessViolation with message 'Access violation at address 7C90100B.Read of address 0000001C'.Process stopped.Use Step or Run to continue.
кнопки OK.Help.
чекбокс View CPU Window
заголовочный файл:
Код:
файл программы:
Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
#include "kontr1.h"
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
Collection <int> *test;
test=new Collection <int> ();
test->manual_input();
cout << test->size_of_vektor();
test->term_output();
cout << "pezdec" << endl;
getch();
delete test;
return 0;
}
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
#include "kontr1.h"
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
Collection <int> *test;
test=new Collection <int> ();
test->manual_input();
cout << test->size_of_vektor();
test->term_output();
cout << "pezdec" << endl;
getch();
delete test;
return 0;
}
//---------------------------------------------------------------------------
окно ошибки появляется после выполнения функции getch();. причем если закомментировать test->manual_input(); ручной ввод с клавиатуры, то ошибка не появляется. выводит конечно мусор из паямяти но без ошибки. не могу понять что ему не нравится. помогите пожалуйста. скоро сессия :(
как вариант - включите CodeGuard, это такая штука, покажет, если вы что-то перемудрили с памятью. Еще можно прикрепить к теме файлы проекта в архиве, так как мне, к примеру, лень создавать проект по исходникам "из окошка". Боюсь, что многим посетителям форума - тоже.
Код:
Collection () :
current_size (5),
max_size (10),
N_comparison (0),
N_exchange (0)
{
obj=new T;
}
template <class T> void Collection <T>:: manual_input ()
{
for (int i = 0 ; i < current_size ; i++)
{
cout << "Enter " << i << " element:";
//cin >> obj;
obj=i*2;
}
}
current_size (5),
max_size (10),
N_comparison (0),
N_exchange (0)
{
obj=new T;
}
template <class T> void Collection <T>:: manual_input ()
{
for (int i = 0 ; i < current_size ; i++)
{
cout << "Enter " << i << " element:";
//cin >> obj;
obj=i*2;
}
}
Вот вам и ошибка.
Кстати, раз уж память выделяете динимически - надежнее работать с auto_ptr, чтобы не забывать очищать.
Вопрос к автору: зачем вы столько стандартных хидеров натыкали? Используются всего 2:
Код:
#include <iostream.h>
#include <conio.h>
#include <conio.h>
Код:
#ifndef _MYHEADER_H_
#define _MYHEADER_H_
code
#endif
#define _MYHEADER_H_
code
#endif