#include <iostream>
using namespace std;
typedef int Mytype;
class CArrayData
{
private:
int size;
Mytype* array;
public:
CArrayData(int size, Mytype* array) // конструктор класса
{
this->array = array;
this->size = size;
}
CArrayData::~CArrayData() { // деструктор
delete[] array;
size = 0;
}
friend void out(CArrayData &CArray);
};
int main(int argc, char** argv)
{
setlocale(LC_ALL, "russian");
int n;
cout << "Введите размер массива: " << endl;
cin >> n;
Mytype *pm = new Mytype[n];
CArrayData Cl(n, pm);
for (int i = 0; i < n; ++i) {
pm[i] = Mytype (rand() % 1000)/ 10;
}
out(Cl);
pm[0] = 100500; //здесь первый элемент изменяется на 100500, как это запретить?
out(Cl);
cin.get();
cin.get();
return 0;
}
void out(CArrayData &CArray)
{
for (int i = 0; i < CArray.size; ++i) {
cout << CArray.array[i] << endl;
}
}
Один из вариантов, ввести изменения в классе (заодно исправим ошибки).
class CArrayData {
const int size; //размер должен быть костантным
const Mytype* array; // для хранения адреса константного обьекта
public:
// константные обьекты инициализируются только инициализатором конструктора
CArrayData(const int size, const Mytype* array)
: size(size), array(array) {}// конструктор класса
~CArrayData() { // тут у вас была ошибка допольнительная квалификация
delete[] array;
}
//...
};
В программе же сначала иницализируем массив, а потом присваиваем его адрес константному указателью:(Правка: указателью на константный обьект)
Mytype *p = new Mytype[n];
for (int i = 0; i < n; ++i) {
p[i] = Mytype (rand() % 1000)/ 10;
}
const Mytype* pm = p;
CArrayData Cl(n, pm);
pm[0] = 100500; //невозможно изменять
Всё оказалось проще, просто перенёс инициализацию массива в конструктор, вроде больше элементы не меняются
#include <iostream>
using namespace std;
typedef int Mytype;
class CArrayData
{
int size;
Mytype* array;
public:
CArrayData(int size, Mytype* array) // конструктор класса
{
cout << "Constructor\n";
this->size = size;
this->array = new Mytype[size];
for (int i = 0; i < size; ++i) {
this->array[i] = (rand()%1000)/10;
}
}
~CArrayData() {
cout << "Destructor\n";
delete[] array;
}
//--------------------------------------------------------------------------
friend void out(CArrayData &CArray);
};
int main(int argc, char** argv)
{
setlocale(LC_ALL, "russian");
int n;
cout << "Введите размер массива: " << endl;
cin >> n;
Mytype *pm = new Mytype[n];
CArrayData Cl(n, pm);
out(Cl);
pm[0] = 100500;
out(Cl);
cin.get();
cin.get();
return 0;
}
void out(CArrayData &CArray)
{
for (int i = 0; i < CArray.size; ++i) {
cout << CArray.array[i] << endl;
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей