【问题标题】:How to find an object created by own class?如何找到自己的类创建的对象?
【发布时间】:2017-04-11 15:20:55
【问题描述】:

我在 MATLAB 中使用我自己的类 my_class 像这样创建了一个对象

car = my_class();

classdef my_class < handle

   properties
       color = 'red';
   end

   methods
      function obj = my_class()
          % ...
      end
   end
end

现在我试图通过类 (my_class) 或属性 (color) 来查找我的对象。但是findallfindobj 总是返回一个空矩阵,无论我在做什么。你有什么线索吗?谢谢。

编辑我需要这样的东西:

car1 = my_classA();
car2 = my_classA();
house1 = my_classB(); ... house25 = my_classB();
tree1 = my_classC(); ... tree250 = my_classC();

在我的代码中,我不能引用句柄的名称(如car2.color),因为我有许多不同的对象,我想通过一个函数来搜索它们,如下所示:

loop over all objects (maybe with findobj/findall without knowing object name/handle)
    if object is of class `my_classA`
        get handle of `my_classA`
        change `color`
    else if object is of class `my_classB`
        get handle of `my_classB`
        do something ...
    end
end

【问题讨论】:

  • 您为什么要这样做?你的用例是什么?
  • 我需要更改属性或需要调用多个对象的方法。但是我需要首先在某种循环或类似的循环中搜索指定的对象,因为我想通过这些值而不是它们的句柄来获取对象。
  • ...但是你为什么不把这些对象收集到一个数组中呢?
  • ...这是从smell 开始的。我想我对这里发生的事情有预感......
  • 啊,好吧,我尝试了您的建议,将所有对象收集在一个数组中。到目前为止,这确实有效。谢谢。但我也想要一种不同的方法,首先在类中查找所有对象。我尝试了h = findall(0,'class','my_classA') 和类似的东西,但每次都返回一个空矩阵。

标签: matlab class oop object find


【解决方案1】:

我想你只是想要这个:

% Create example array of objects
A(20) = object;
[A([3 14 17]).color] = deal('blue');

% Get those objects which are red, and change to orange
[A(strcmp({A.color}, 'red')).color] = deal('orange');

我不得不承认,findobj 读起来会更好。 但据我所知,这只适用于图形句柄,所以你必须为你的班级重载它。

而那个重载的函数,将包含与此类似的东西。

EDIT 正如 Navan 所说,这很有效:

B = findobj(A, 'color', 'red');
[B.color] = deal('orange');

似乎也比strcmp 方法快。

【讨论】:

  • findobj 在这种情况下应该可以正常工作。 B = findobj(A, '颜色', '红色'); [B.color] = deal('橙色');只要您将句柄作为第一个输入传递,findobj 就适用于句柄类。
  • 谢谢,但这并不完全是我想要的。我需要(首先)遍历所有自己的对象(不使用或不知道对象的句柄)然后(第二)获取特定对象的句柄的东西。
  • @Lemonbonbon ...你为什么不能用我提供的代码做到这一点?也许您正在寻找函数isa()?如果这仍然不是您想要的,请您编辑您的确切目标,包括示例输入和预期结果。
猜你喜欢
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
相关资源
最近更新 更多