MATLAB面向对象编程问题:调用实例方法时构造函数重复执行
问题原因及解决办法
核心原因
你创建的way类是MATLAB默认的值类,值类在调用方法时会自动创建对象副本,你在getWaypoint里修改的是这个副本的n属性,而原实例path的n根本没被更新。每次循环调用方法时,都是基于原实例的初始状态(n=1)生成新副本,所以看起来像是n被重置了。
解决办法
1. 将类改为句柄类
让way类继承MATLAB的handle基类,句柄类采用引用传递,方法中对属性的修改会直接作用于原实例,不会创建副本。修改后的类定义示例:
classdef way < handle % 继承handle类 properties waypoints % 存储航点矩阵 n = 1 % 当前航点计数器,属性区初始化 end methods % 构造函数 function obj = way(waypoints_mat) obj.waypoints = waypoints_mat; % 属性区已初始化n为1,此处可省略重复赋值 end % 获取当前航点并更新计数器 function current_wp = getWaypoint(obj, drone_pos) % 判断是否到达当前航点的逻辑(示例) if norm(drone_pos - obj.waypoints(:, obj.n)) < 0.1 if obj.n < size(obj.waypoints, 2) obj.n = obj.n + 1; % 直接修改原实例的n end end current_wp = obj.waypoints(:, obj.n); end end end
2. 检查仿真脚本的调用逻辑
确保脚本中只初始化一次path实例,循环内直接调用其方法,不要在循环里重新创建实例:
% 仿真脚本示例 waypoints = [1 2 3; 4 5 6; 7 8 9]; % 3D航点矩阵 path = way(waypoints); % 只初始化一次 for t = 1:100 % 仿真时间步循环 drone_pos = get_drone_current_position(); % 你的无人机位置获取逻辑 current_wp = path.getWaypoint(drone_pos); % 调用方法,直接修改原实例的n % 无人机跟踪逻辑... end
3. 避免在方法中重复初始化属性
不要在getWaypoint方法里重新给n赋值为1,确保只有构造函数或属性区初始化n的初始值。
内容的提问来源于stack exchange,提问作者IsaacB
相关产品推荐
相关产品推荐

