You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:43:10