Не могли бы вы объяснить, почему при печати двумерного динамического масиива, несмотря на то, что у него в одной из строк больше элементов, выводится только то количество, которое совпадает с количеством элементов в других строках. | Код | #include "iostream" #include "conio.h" using namespace std; class Vektor { int *pvect; int size; //размерность вектора public: Vektor(int n = 1); //конструктор, позволяющий задавать размерность вектора Vektor(const Vektor&); //конструктор копирования ~Vektor(); //деструктор void Print(int); //печать одного элемента вектора void PrintAll(); //печать всего вектора void operator +=(Vektor); //сложение двух векторов Vektor operator + (const Vektor&); //сложение двух векторов Vektor & operator=(const Vektor&); //перегруженный оператор присваивания int & operator[](int); //перегруженный оператор индексации }; class Vektor_2D { public: Vektor *pvect_2D; int size_str, size_stol; public: Vektor_2D (int m = 1, int n = 1); //конструктор, позволяющий задавать размеры матрицы Vektor_2D (const Vektor_2D& ); //конструктор копирования ~Vektor_2D(); //деструктор void Inicialization(); //инициализация void PrintAll(); //печать всей матрицы Vektor& Vektor_2D::operator [] (int); //перегруженный оператор индексации Vektor_2D& Vektor_2D::operator = (const Vektor_2D& ); //перегруженный оператор присваивания void Insert (int, int, int); //вставка элемента }; //--------------------------- //конструктор, позоляющий задавать размерность вектора Vektor::Vektor(int n) { size = n; pvect = new int[size]; for (int i = 0; i < size; i++) pvect[i] = 0; } //--------------------------- //конструктор копирования Vektor::Vektor(const Vektor &right) { size = right.size; pvect = new int[size]; for (int i = 0; i < size; i++) pvect[i] = right.pvect[i]; } //--------------------------- //деструктор Vektor::~Vektor() { delete [] pvect; } //--------------------------- //печать одного элемента вектора void Vektor::Print(int nomer) { if (nomer > size) { cout << "Net takogo elementa" << endl; } else { cout << operator[] (nomer-1) << endl; } } //--------------------------- //печать всего вектора void Vektor::PrintAll() { for (int i = 0; i < size; i++) { cout << pvect[i] <<" "; } cout << endl; } //--------------------------- //сложение двух векторов void Vektor::operator +=(Vektor x1) { Vektor x2; x2.size = x1.size + size; x2.pvect = new int [x2.size]; for (int i = 0; i < size; i++) { x2.pvect[i] = pvect[i]; } for (int i = size; i < size + x1.size; i++) { x2.pvect[i] = x1.pvect[i-size]; } *(this) = x2; } //--------------------------- //сложение двух векторов Vektor Vektor::operator+ (const Vektor& right) { if (size == right.size) //размерности векторов совпадают { Vektor tmp(size); //создание временного объекта for (int i = 0; i < size; i++) tmp.pvect[i] = pvect[i] + right.pvect[i]; return tmp; } else //размерности векторов не совпадают { cout <<"Raznue razmernosti vektorov" << endl; return *this; } } //--------------------------- //перегруженный оператор присваивания Vektor& Vektor::operator=(const Vektor& right) { if (&right == this) //проверка на присваивание return *this; //объекта самому себе if (size != right.size && size != 0) { delete [] pvect; size = right.size; pvect = new int[size]; } for (int i = 0; i < size; i++) pvect[i] = right.pvect[i]; return *this; } //--------------------------- //перегруженный оператор индексации int& Vektor::operator[] (int n) { int *ptr = pvect; int k = size; if (n < 0) //если индекс меньше нуля, { //то возвращаем нулевой элемент массива cout << "Indeks slishkom malen'kii" << endl; return pvect[0]; } else if (n > size - 1) //если индекс больше максимального элемента { while (k < n + 1) k++; pvect = new int[k]; for (int i = 0; i < size; i++) { pvect[i] = ptr[i]; } delete [] ptr; for (int i = size; i < k; i++) { pvect[i] = 0; } size = k; return pvect[n]; } else //возврат заданного элемента return pvect[n]; } //--------------------------- //конструктор, позволяющий задавать размеры матрицы Vektor_2D::Vektor_2D(int m, int n) { size_str = m; size_stol = n; pvect_2D = new Vektor [size_str]; for (int i = 0; i < size_str; i++) { for (int j = 0; j < size_stol; j++) { operator[](i)[j] = 0; } } } //--------------------------- //конструктор копирования Vektor_2D::Vektor_2D (const Vektor_2D& matrica) { size_str = matrica.size_str; size_stol = matrica.size_stol; pvect_2D = new Vektor [size_str]; for (int i = 0; i < size_str; i++) *(pvect_2D + i) = *(matrica.pvect_2D + i); } //--------------------------- //деструктор Vektor_2D::~Vektor_2D() { delete [] pvect_2D; } //--------------------------- //инициализация void Vektor_2D::Inicialization() { for (int i = 0; i < size_str; i++) { for (int j = 0; j < size_stol; j++) { operator[](i)[j]=i; } } } //--------------------------- //печать всей матрицы void Vektor_2D::PrintAll() { for (int i = 0; i < size_str; i++) { for (int j = 0; j < size_stol; j++) { cout << operator[](i)[j]<< " "; } cout << endl; } } //--------------------------- //перегруженный оператор индексации Vektor& Vektor_2D::operator [] (int stroka) { int m = size_str; if (stroka < size_str) { return *(pvect_2D + stroka); } else { Vektor_2D Matr = *this; while (m < stroka) m += size_str; delete [] pvect_2D ; pvect_2D = new Vektor[m]; for (int i = 0; i < size_str; i++) { pvect_2D[i] = Matr.pvect_2D[i]; } size_str = m; return pvect_2D[stroka]; } } //--------------------------- //перегруженный оператор присваивания Vektor_2D& Vektor_2D::operator = (const Vektor_2D& matrica) { delete [] pvect_2D; size_str = matrica.size_str; size_stol = matrica.size_stol; pvect_2D = new Vektor [size_str]; for (int i = 0; i < size_str; i++) { *(pvect_2D + i) = *(matrica.pvect_2D + i); } return *(this); } //--------------------------- //вставка элемента void Vektor_2D::Insert(int data, int m, int n) { if ((m <= size_str) && (n <= size_stol)) { operator[](m)[n] = data; } else { int p = size_str, q = size_stol; while ( p <= m) { p += size_str; } while ( q <= n) { q += size_stol; } Vektor_2D Matr = *this; delete [] pvect_2D; pvect_2D = new Vektor [p]; for (int i = 0; i < size_str; i++) { for (int j = 0; j < size_stol; j++) { operator[](i)[j] = Matr[i][j]; } } size_str = p; size_stol = q; operator[](m)[n] = data; } } class Application { public: void Run(); }; void Application::Run() { Vektor_2D matrica1(4,4); matrica1[1][3] = 1; matrica1.PrintAll(); cout << endl; matrica1[5][2] = 1; matrica1.PrintAll(); cout << endl; matrica1[1][6] = 1; matrica1.PrintAll(); cout << endl; matrica1[1].PrintAll(); /*Vektor_2D matrica2 = matrica1; matrica2.PrintAll(); cout << endl; Vektor_2D matrica3; matrica3 = matrica1; matrica1[5][2] = 3; matrica1.PrintAll(); cout << endl; matrica1.Inicialization(); matrica1[6][2] = 3; matrica1.PrintAll(); cout << endl; matrica2.Insert(10, 6, 5); matrica2.PrintAll(); cout << endl; matrica3.Inicialization(); matrica3.PrintAll(); cout << endl; cout << matrica3 [2][3] << endl; matrica3[1].PrintAll();*/ _getch(); } void main() { Application *pApplication = new Application; pApplication->Run(); }
|
p.s. привела код всей программы, чтобы запустив и увидев, можно было понять суть моего вопроса. Может быть нужно как-то по-другому переопределять индексирование?
|