2011-06-23 18 views
15

MATLAB कक्षाओं में स्थिर सदस्य चर परिभाषित करने का कोई तरीका है?MATLAB कक्षाओं में स्थिर सदस्य चर कैसे प्राप्त करें?

यह काम नहीं करता:

classdef A 

    properties (Static) 
     m = 0; 
    end 
end 

यह "स्थिर" के बजाय कीवर्ड "लगातार" का उपयोग करने का सुझाव देते हैं, लगातार गुण संशोधित नहीं किया जा सकता है। मैं वर्ग A वर्ग की सभी वस्तुओं के लिए एक चर सामान्य चाहता हूं और मैं कक्षा A के तरीकों में उस चर को संशोधित करने में सक्षम होना चाहता हूं।

तो मुझे जो चाहिए वह एक निजी स्थैतिक सदस्य चर है। MATLAB में इसे प्राप्त करने का कोई तरीका है?


बाहर पाया गया कि एक वैकल्पिक हल स्थिर सदस्य कार्यों में लगातार वैरिएबल का उपयोग किया जा सकता है।

इस मामले में आपको निम्न वर्गों से निम्न वर्गों से अपने सभी वर्गों का उत्तराधिकारी होना चाहिए।

classdef object < handle 

    properties (GetAccess = 'public', SetAccess = 'private') 
     id 
    end 

    methods (Access = 'protected') 
     function obj = object() 
      obj.id = object.increment(); 
     end 
    end 

    methods (Static, Access = 'private') 
     function result = increment() 
      persistent stamp; 
      if isempty(stamp) 
       stamp = 0; 
      end 
      stamp = stamp + uint32(1); 
      result = stamp; 
     end 
    end 
end 
+1

इसका अर्थ AFAIK के लिए नहीं है, लेकिन [लगातार] (http://www.mathworks.com/help/techdoc/ref/persistent.html) काम करता है? –

+1

हां, मैंने स्थिर सदस्य फ़ंक्शन में लगातार चर के साथ एक समाधान प्राप्त किया है। – Vahagn

+1

आपको इसे इस प्रश्न में रुचि रखने वाले अन्य लोगों के उत्तर के रूप में पोस्ट करना चाहिए –

उत्तर

15

आप डिज़ाइन द्वारा नहीं कर सकते हैं। आपको persistent वैरिएबल (1 9 80 के रूप में MATLAB से तकनीक वर्ष 2011 में लागू) का उपयोग करना चाहिए!

पूर्णता के लिए मुझे उल्लेख करना चाहिए कि वास्तव में 2010b के रूप में एक अनियंत्रित है और शायद static संपत्ति संशोधक समर्थित नहीं है।

पृष्ठभूमि के लिए here देख Dave Foti का जवाब है, MATLAB OO समूह प्रबंधक:

MATLAB में, कक्षाओं में लगातार गुण परिभाषित कर सकते हैं, लेकिन "स्थिर" नहीं सी जैसे अन्य भाषाओं के अर्थ में गुण ++ । बीटा रिलीज़ थे जो "स्टेटिक" गुणों के साथ प्रयोग किए गए थे और अनियंत्रित विशेषता से बनी हुई है। हालांकि, स्टेटिक विशेषता अनियंत्रित है, इसका उपयोग नहीं किया जाना चाहिए, और भविष्य में MATLAB रिलीज़ में हटा दिया जाएगा। R2008a इसे को कॉन्स्टेंट के समानार्थी के रूप में लागू करता है और प्रदान करता है से परे कोई अतिरिक्त कार्यक्षमता कॉन्स्टेंट गुणों के दस्तावेज़ व्यवहार।

संपत्ति गुणों में निर्दिष्ट प्रारंभिक मूल्य से को संपत्ति घोषणा घोषित नहीं किया जा सकता है। कुछ कारण हैं कि MATLAB इस तरह से काम करता है। सबसे पहले, MATLAB कि काम बयानों एक चर परिचय अगर एक पहले से ही मौजूद नहीं है पुराना नियम है कि चर हमेशा नामों कार्यों और वर्गों के से अधिक मिसाल लेने के लिए और है। इस प्रकार, "एबी = सी" फ़ॉर्म की कोई अभिव्यक्ति एक नया वैरिएबल ए पेश करेगी जो एक संरचना सरणी है जिसमें फ़ील्ड बी है जिसका मान सी है। "ए।बी = सी ' वर्ग एक के लिए एक स्थिर संपत्ति की जानकारी दे सकती, तो वर्ग एक चर एक से अधिक मिसाल ले जाएगा और इस पहले रिलीज MATLAB के साथ एक बहुत ही महत्वपूर्ण असंगति होगा। इसका मतलब यह होता है कि एक मीटर -file काम बयान "AB = सी ' चर शुरू बयान, जिसमें यह अर्थ MATLAB रास्ते पर एक कहीं नाम के एक वर्ग की शुरूआत द्वारा बदला हो सकता था। MATLAB प्रोग्रामर हमेशा काम पर भरोसा करने के लिए सक्षम किया गया है कि उसी नाम का कोई अन्य उपयोग छाया।

दूसरा, हमने पाया है कि स्थिर डेटा में डेटा का शायद ही कभी उपयोग किया जाता है, कक्षा या सार्वजनिक स्थिरांक के रूप में निजी डेटा को छोड़कर। उदाहरण के लिए, कई जावा कक्षा पुस्तकालयों के एक सर्वेक्षण में पाया गया कि सभी सार्वजनिक स्थिर फ़ील्ड भी अंतिम थे। MATLAB में, लगातार गुण जावा में "सार्वजनिक अंतिम स्थैतिक" फ़ील्ड जैसे प्रयुक्त हो सकते हैं। कक्षा में आंतरिक डेटा के लिए, MATLAB में पहले से ही वेरिएबल्स हैं जो निजी या संरक्षित विधियों या स्थानीय कार्यों को कक्षा द्वारा निजी रूप से उपयोग किए जाने वाले स्थानीय कार्यों के अंदर बनाया जा सकता है। के अच्छे कारण भी हैं MATLAB में स्थिर डेटा से बचें जहां संभव है। यदि किसी वर्ग में स्थिर डेटा है, एक ही कक्षा का उपयोग कई अनुप्रयोगों में करना मुश्किल हो सकता है क्योंकि स्थिर डेटा अनुप्रयोगों के बीच संघर्षों का स्रोत हो सकता है। कुछ अन्य भाषाओं में, यह एक समस्या से कम है क्योंकि अलग-अलग अनुप्रयोग अलग-अलग में चल रहे निष्पादन योग्य में अलग-अलग वर्ग स्थिर डेटा की प्रतियों के साथ अलग-अलग प्रक्रियाओं में संकलित किए गए हैं। MATLAB में, अक्सर अनुप्रयोग में प्रत्येक वर्ग की एकल प्रति के साथ समान प्रक्रिया और वातावरण में चल रहे हैं।

11

मैटलैब में स्थिर संपत्ति बनाने का एक सीधा तरीका यहां है। इस कार्यान्वयन और एक काल्पनिक (लेकिन असंभव; मिखाइल के उत्तर को देखें) के बीच एकमात्र अंतर वास्तविक स्थैतिक संपत्ति सदस्य चर सेट करने के लिए वाक्यविन्यास है।

classdef StaticVarClass 
    methods (Static = true) 
     function val = staticVar(newval) 
      persistent currentval; 
      if nargin >= 1 
       currentval = newval; 
      end 
      val = currentval; 
     end 
    end 
end 

अब स्थिर संपत्ति staticVar के माध्यम से पढ़ा जा सकता है:

StaticVarClass.staticVar 

... और के माध्यम से स्थापित किया जा:

StaticVarClass.staticVar(newval); 

तो, उदाहरण के लिए, इस से उम्मीद उत्पादन होता है इस कार्यक्षमता का एक परीक्षण:

>> StaticVarClass.staticVar 
    ans = 
     [] 
>> StaticVarClass.staticVar('foobar') 
    ans = 
     foobar 
>> StaticVarClass.staticVar 
    ans = 
     foobar 
>> 

यह दृष्टिकोण आपके द्वारा अनुरोध किए गए निजी स्थैतिक गुणों के लिए भी काम करता है, लेकिन डेमो कोड थोड़ा लंबा है। ध्यान दें कि यह एक हैंडल क्लास नहीं है (हालांकि यह एक हैंडल क्लास पर भी पूरी तरह से अच्छा काम करेगा)।

classdef StaticVarClass 
    methods (Access = private, Static = true) 
     function val = staticVar(newval) 
      persistent currentval; 
      if nargin >= 1 
       currentval = newval; 
      end 
      val = currentval; 
     end 
    end 

    methods 
     function this = setStatic(this, newval) 
      StaticVarClass.staticVar(newval); 
     end 

     function v = getStatic(this) 
      v = StaticVarClass.staticVar; 
     end 
    end 
end 

...और परीक्षण:

>> x = StaticVarClass 
    x = 
     StaticVarClass with no properties. 
     Methods 
>> x.getStatic 
    ans = 
     [] 
>> x.setStatic('foobar') 
    ans = 
     StaticVarClass with no properties. 
     Methods 
>> x.getStatic 
    ans = 
     foobar 
>> 
0

(सिर्फ सूचित करने के लिए) matlab में डेटा स्थिर की तरह

लगता है कि आप एक "संभाल" वर्ग है जो अपने नाम "है बनाने के लिए (एक और?) जिस तरह से है कार " यदि आप स्थिर डेटा के लिए कार वर्ग चाहते हैं, आप एक और संभाल वर्ग का निर्माण और कार वर्ग फेंक संरचना में इसका इस्तेमाल कर सकते है, बाद वर्ग कार वर्ग

classdef car<handle 
    properties 
     static_data:STATIC_DATA_HOLDER; 
    end 
end 

classdef STATIC_DATA_HOLDER<handle 
    properties 
     data 
    end 
end 

इस तरह से जब के लिए एक स्थिर डेटा के रूप में काम करता है आप एक कार का पहला उदाहरण बनाते हैं कक्षा, STATIC_DATA_HOLDER का एक उदाहरण बनाया जाएगा और जब आप कार वर्ग का दूसरा उदाहरण बनाते हैं तो यह पहले बनाए गए STATIC_DATA_HOLDER वर्ग का उपयोग करता है।

इन कोड के साथ "MATLAB 2013b"

0

एक और वैकल्पिक हल स्थिर गुणों की तरह कुछ पाने के लिए परीक्षण किया तथ्य यह है कि सदस्य चर के लिए initialisation कोड केवल एक बार जब वर्ग फ़ाइल लोड किया जाता है निष्पादित किया जाता है का उपयोग करें। इसका मतलब है कि, अगर आप

classdef foo 
    properties 
     stuff = some_function() 
    end 
end 

तो some_function शुरू हो जाती है की तरह एक परिभाषा केवल एक बार किया है, और अगर यह वर्ग प्रकार का ऑब्जेक्ट देता है, यह सभी उदाहरणों द्वारा साझा किया जाएगा। आप इस नमूना कोड

obj1 = ClassWithStaticMembers(3); 
obj2 = ClassWithStaticMembers(5); 
obj1.classvars.foo = [2,3]; 

obj1.othervar 
obj1.classvars 

obj2.othervar 
obj2.classvars 

आप देखेंगे चलाते हैं

classdef ClassWithStaticMembers 
    properties 
     classvars = StaticVarContainer('foo', 0, 'bar', 2); 
     othervar 
    end 
    methods 
     function obj=ClassWithStaticMembers(var) 
      obj.othervar = var; 
     end 
    end 
end 

classdef StaticVarContainer < dynamicprops 
    methods 
     function obj=StaticVarContainer(varargin) 
      for i=1:2:numel(varargin) 
       obj.addprop(varargin{i}); 
       obj.(varargin{i}) = varargin{i+1}; 
      end 
     end 
    end 
end 

, कि classvars वास्तव में साझा किया जाता है: मैं एक नमूना कार्यान्वयन पता चलता है कि कैसे किया जा सकता है जोड़ दिया है। मुझे लगता है कि यह समाधान फ़ंक्शंस में लगातार चर का उपयोग करने से बहुत अच्छा है, क्योंकि आप जितनी बार चाहें StaticVarContainer का पुन: उपयोग कर सकते हैं, इसका उपयोग करना आसान है, और इसके अलावा, आप सीधे गुण अनुभाग में स्थिर चर के प्रारंभिकरण को देखते हैं।

परिणाम प्राप्त करने के लिए, कि ओपी के सवाल में वांछित है (यानी एक वस्तु काउंटर को लागू करने) साझा संपत्ति, Constant बनाया जा सकता है इतना है कि यह हाथ में एक उदाहरण के बिना संदर्भित किया जा सकता:

classdef ClassWithCounter 
    properties (Constant) 
     static = StaticVarContainer('counter', 0); 
    end 
    methods 
     function obj=ClassWithCounter() 
      obj.static.counter = obj.static.counter + 1; 
     end 
    end 
end 

clear all 
obj1 = ClassWithCounter(); 
obj2 = ClassWithCounter(); 
obj3 = ClassWithCounter(); 

ClassWithCounter.static.counter 

नोट, कि Constant विशेषता केवल इसका अर्थ है, उदाहरण के लिए obj1.static को बदला नहीं जा सकता है, लेकिन यह obj1.static.counter को प्रभावित नहीं करता है जो स्थिर नहीं है, और इसे हृदय की इच्छा पर सेट किया जा सकता है।

संबंधित मुद्दे