Обработка поведения объекта

Больше чем одна переменная может относиться к тому же объекту указателя. Поэтому пользователи взаимодействуют с экземплярами классов Handle по-другому, чем экземпляры классов значения. Понимание, как объекты указателя ведут себя, может помочь вам определить, реализовать ли указатель или класс значения. Эта тема иллюстрирует некоторые из тех взаимодействий.

Для получения дополнительной информации о классах Handle см. Классы Handle.

Что такое указатель?

Определенными видами объектов MATLAB® является handles. Когда переменная содержит указатель, она на самом деле содержит ссылку на объект.

Объекты указателя позволяют больше чем одной переменной относиться к тому же объекту. Поведение объекта указателя влияет на то, что происходит, когда вы копируете объекты указателя и когда вы передаете их функциям.

Копии указателей

Все копии переменной объекта указателя относятся к тому же основному объекту. Это ссылочное поведение означает это если h идентифицирует объект указателя, затем,

h2 = h;

Создает другую переменную, h2, это называет тот же объект h.

Например, audioplayer MATLAB функция создает объект указателя, который содержит данные об источнике аудиосигналов, чтобы воспроизвести определенный звуковой сегмент. Переменная возвращена audioplayer функция идентифицирует аудиоданные и позволяет вам к функциям объекта доступа проигрывать аудио.

Программное обеспечение MATLAB включает аудиоданные, которые можно загрузить и использовать, чтобы создать audioplayer объект. Эти демонстрационные аудиоданные загрузки, создают аудиоплеер и проигрывают аудио:

load gong Fs y
gongSound = audioplayer(y,Fs);
play(gongSound)

Предположим, что вы копируете gongSound указатель на объект к другой переменной (gongSound2):

gongSound2 = gongSound;

Переменные gongSound и gongSound2 копии того же указателя и, поэтому, относятся к тому же источнику аудиосигналов. Доступ к audioplayer информация с помощью любой переменной.

Например, установите частоту дискретизации для источника аудиосигналов гонга путем присвоения нового значения SampleRate свойство. Сначала получите текущую частоту дискретизации и затем установите новую частоту дискретизации:

sr = gongSound.SampleRate;
disp(sr)
8192
gongSound.SampleRate = sr*2;

Можно использовать gongSound2 получить доступ к тому же источнику аудиосигналов:

disp(gongSound2.SampleRate)
16384

Проигрывайте звук гонга с новой частотой дискретизации:

play(gongSound2)

Обработка объектов, измененных в функциях

Когда вы передаете аргумент функции, функция копирует переменную из рабочей области, в которой вы вызываете функцию в переменную параметра в рабочей области функции.

Передача переменной неуказателя к функции не влияет на исходную переменную, которая находится в рабочей области вызывающей стороны. Например, myFunc изменяет локальную переменную под названием var, но когда функция заканчивается, локальная переменная var больше не существует:

function myFunc(var)
   var = var + 1;
end

Задайте переменную и передайте ее myfunc:

x = 12;
myFunc(x)

Значение x не изменился после выполнения myFunc(x):

disp(x)
12

myFunc функция может возвратить модифицированное значение, которое вы могли присвоить тому же имени переменной (x) или другая переменная.

function out = myFunc(var)
   out = var + 1;
end

Измените значение в myfunc:

x = 12;
x = myFunc(x);
disp(x)
13

Когда аргумент является переменной указателя, функция копирует только указатель, не объект, идентифицированный тем указателем. Оба указателя (исходная и локальная копия) относятся к тому же объекту.

Когда функция изменяет данные, упомянутые указателем на объект, те изменения доступны от переменной указателя в рабочей области вызова без потребности возвратить модифицированный объект.

Например, modifySampleRate функционируйте изменяет audioplayer частота дискретизации:

function modifySampleRate(audioObj,sr)
   audioObj.SampleRate = sr;
end

Создайте audioplayer объект и передача это к modifySampleRate функция:

load gong Fs y
gongSound = audioplayer(y,Fs);
disp(gongSound.SampleRate)
8192
modifySampleRate(gongSound,16384)
disp(gongSound.SampleRate)
16384

modifySampleRate функция не должна возвращать модифицированный gongSound возразите потому что audioplayer объекты являются объектами указателя.

Определите, является ли объектом указатель

Объекты указателя являются членами handle класс. Поэтому можно всегда идентифицировать объект как указатель с помощью isa функция. isa возвращает логический true(1 ) при тестировании на переменную указателя:

load gong Fs y
gongSound = audioplayer(y,Fs);
isa(gongSound,'handle')

Чтобы определить, является ли переменная допустимым объектом указателя, используйте isa и isvalid:

if isa(gongSound,'handle') && isvalid(gongSound)
   ...
end

Удаленные объекты указателя

Когда объект указателя был удален, переменные указателя, которые сослались на объект, могут все еще существовать. Эти переменные становятся недопустимыми, потому что объект, который они не упоминали больше, существует. Вызов delete на объекте удаляет объект, но не очищает переменные указателя.

Например, создайте audioplayer объект:

load gong Fs y
gongSound = audioplayer(y,Fs);

Выходной аргумент, gongSound, переменная указателя. Вызов delete удаляет объект наряду с информацией об источнике аудиосигналов, которую он содержит:

delete(gongSound)

Однако переменная указателя все еще существует:

disp(gongSound)
handle to deleted audioplayer

whos команда показывает gongSound как audioplayer объект:

whos
  Name               Size             Bytes  Class          Attributes

  Fs                 1x1                  8  double                   
  gongSound          1x1                  0  audioplayer              
  y              42028x1             336224  double      

Примечание

Значение для Байтов, возвращенных whos команда не включает данные, на которые ссылается указатель, потому что много переменных могут сослаться на те же данные.

Указатель gongSound больше не относится к доступному объекту, как показано isvalid метод указателя:

isvalid(gongSound)
ans =

  logical

   0

Вызов delete на удаленном указателе ничего не делает и не вызывает ошибку. Можно передать массив, содержащий и допустимые и недопустимые указатели на delete. MATLAB удаляет допустимые указатели, но не выдает ошибку при обнаружении с указателями, которые уже недопустимы.

Вы не можете получить доступ к свойствам с недопустимой переменной указателя:

gongSound.SampleRate
Invalid or deleted object.

Функции и методы, что свойства объектов доступа вызывают ошибку:

play(gongSound)
Invalid or deleted object.

Удалить переменную, gongSound, используйте clear:

clear gongSound
whos
  Name          Size             Bytes  Class     Attributes

  Fs            1x1                  8  double              
  y         42028x1             336224  double   

Похожие темы