Объектно-ориентированное программирование на языке С++. Лясин Д.Н - 19 стр.

UptoLike

Составители: 

19
m.ReadMas();
m.WriteMas();
}
Проблема здесь заключается в том, что для класса не предусмотрена защита
от некорректных вызовов методов, и метод чтения массива ReadMas может быть
вызван еще до инициализации массива, то есть без выделения памяти под него.
Это обязательно в дальнейшем приведет к потере данных. Таким образом, можно
сказать, что для данного класса не продуман
как следует интерфейс, который бы
обеспечивал целостность объекта при любых операциях с ним.
Решением проблемы могло бы стать введение дополнительного члена
данных, который своим значением определял, проинициализирован ли массив
или нет. Переопределим класс array:
//Листинг 5. Решение проблемы некорректности интерфейса класса введением дополнительного
//компонентного данного
struct array
{ int *mas, n;
int present;
void InitMas(int k)
{if (!present)
{if (k>0)
{ n=k;
mas=new int[n];
present=1;
}
}
else cout<<”Память уже выделена”;
}
void DelMas() //функция уничтожения массива
{if (present)
{ n=0;
delete []mas;
present=0;
}
else cout<<”Память не была выделена”;
}
void ReadMas() //функция ввода массива в клавиатуры
{if(present)
{ cout<<"Ввод массива";
for (int i=0;i<n;i++)
cin>>mas[i];
}
else cout<<”Ошибка! Память под массив не выделена”;
          m.ReadMas();
          m.WriteMas();
      }
      Проблема здесь заключается в том, что для класса не предусмотрена защита
от некорректных вызовов методов, и метод чтения массива ReadMas может быть
вызван еще до инициализации массива, то есть без выделения памяти под него.
Это обязательно в дальнейшем приведет к потере данных. Таким образом, можно
сказать, что для данного класса не продуман как следует интерфейс, который бы
обеспечивал целостность объекта при любых операциях с ним.
     Решением проблемы могло бы стать введение дополнительного члена
данных, который своим значением определял, проинициализирован ли массив
или нет. Переопределим класс array:
//Листинг 5. Решение проблемы некорректности интерфейса класса введением дополнительного
//компонентного данного
       struct array
       { int *mas, n;
        int present;
         void InitMas(int k)
         {if (!present)
         {if (k>0)
          { n=k;
             mas=new int[n];
             present=1;
           }
         }
        else cout<<”Память уже выделена”;
          }
        void DelMas() //функция уничтожения массива
         {if (present)
           { n=0;
              delete []mas;
              present=0;
           }
         else cout<<”Память не была выделена”;
         }
         void ReadMas() //функция ввода массива в клавиатуры
          {if(present)
            { cout<<"Ввод массива";
              for (int i=0;i>mas[i];
            }
            else cout<<”Ошибка! Память под массив не выделена”;

                                           19