IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

class et subsref


Sujet :

MATLAB

  1. #1
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut class et subsref
    Bonjour,
    Le comportement suivant est-il normal ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    classdef testsubs < handle
        properties
            value=[];        
        end    
        methods
            function self = testsubs(varargin) % value,date,names,title
                self.value=1;
            end   
            function f(self)
               y= testsubs();
               y(2,2);            
            end        
            function varargout = subsref(self,idx)
                varargout= cell(1,nargout);
                %if length(idx)== 1 && strcmp(idx.type,'()')
                if strcmp(idx(1).type,'()')
                    assert( length(idx(1).subs)==2);
                    %[~,idx(1)]= self.name_index(idx(1));
                    items={};
                    props= properties(self);
                    for k=1:length(props) %self.colfields)
                        field_name= props{k};
                        items{end+1}= field_name;
                        items{end+1}= getfield(self,field_name); %self.subs_field(field_name,idx(1));
                    end
                    [varargout{:}]= odata(items{:});
                else
                    %subdata= 'comment appeler subsref non surchargée ?';
                    [varargout{:}]= builtin('subsref', self, idx);
                end
            end
        end
    end
    Voici une classe qui surcharge subsref() - le but étant uniquement de modifier le comportement d'un appel du type "instance(x,y)".

    Lorsqu'on apelle subsref sur une instance depuis base, ca marche. Par contre, si je l'appelle depuis la méthode f(), ca plante, même sur une autre instance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    t= testsubs();
    x=t(2,2) % appel direct: marche
    t.f() % appel dans une méthode : echoue
    Ce que je pense comprendre:
    * L'appel "t.f()" passe par testsubs.subsref(), ce qui apelle builtin.subsref(). Ici, pas vraiment le choix pour éviter la boucle infinie. remarquer au passage que cet appel va directement à l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [varargout{:}]= builtin('subsref', self, idx);
    donc mon code ne semble pas responsable.

    * Cet appel à builtin.subsref() court-circuite ma méthode dérivée testsubs.subsref() dans f(). Ce qui est choquant, c'est qu'il court circuite le comportement d'une nouvelle instance y (et bien sur,il court circuite aussi l'instance courante) !!!!

    Voyez- vous comment obtenir le comportement désiré ? Ais-je fait une erreur grossière dans mon subsref() ?

    Merci d'avance

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Je viens de trouver une piste...
    Within a class's own methods, MATLAB calls the built-in subsasgn, not the class defined subsasgn. This behavior enables to use the default subsasgn behavior when defining specialized indexing for your class. See subsref and subsasgn Within Class Methods — Built-In Called for more information.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. class ,subsref, subsasgn
    Par shaiHulud dans le forum MATLAB
    Réponses: 0
    Dernier message: 10/07/2012, 13h02
  2. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  3. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  4. Variable d'une Classe Ancêtre
    Par Génie dans le forum Langage
    Réponses: 3
    Dernier message: 18/09/2002, 19h24
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo