সি ++ 11 এর কি # স্টাইল বৈশিষ্ট্য রয়েছে?


93

সি # তে গিটার এবং সেটারযুক্ত ক্ষেত্রগুলির জন্য একটি দুর্দান্ত সিনট্যাক্স চিনি রয়েছে। তদুপরি, আমি স্বতঃ-প্রয়োগকৃত বৈশিষ্ট্যগুলি পছন্দ করি যা আমাকে লেখার অনুমতি দেয়

public Foo foo { get; private set; }

সি ++ এ আমাকে লিখতে হবে

private:
    Foo foo;
public:
    Foo getFoo() { return foo; }

সি ++ 11 এ কি এরকম কিছু ধারণা রয়েছে যা আমাকে এর উপর কিছু সিনট্যাক্স চিনির অনুমতি দেয়?


64
এটি কয়েক ম্যাক্রো দিয়ে করা যেতে পারে। লজ্জায় পালিয়ে যায়
মানকারসে

7
@ অলফ: সব কিছুকে জনসমক্ষে তৈরি করা সবসময়ই একটি খারাপ ধারণা।
কাইসারলুদি

8
এরকম কোনও ধারণা নেই! এবং আপনারও এটির দরকার নেই: seanmiddleditch.com/why-c-does-not-need-c- Like
paperties

4
ক) এই প্রশ্নটি বেশ পুরানো একটি খ) আমি সিনট্যাক্স চিনির জন্য জিজ্ঞাসা করছিলাম, যা আমাকে প্রথম বন্ধনী থেকে মুক্তি দিতে পারবে গ) যদিও নিবন্ধটি অ্যাডাপ্টিংয়ের বৈশিষ্ট্যের বিরুদ্ধে বৈধ যুক্তি উপস্থাপন করে, যদিও সি ++ 'বৈশিষ্ট্যগুলি দরকার হয় না বা প্রয়োজন হয় না' খুব বিষয়গত। সি ++ ট্যুরিং-মেশিনের সমতুল্য এমনকি তাদের ছাড়াই, তবে এর অর্থ এই নয় যে এই জাতীয় সিনট্যাক্স চিনি থাকা সি ++ আরও উত্পাদনশীল করে তুলবে।
রাদিম ভানসা

4
অবশ্যই না.

উত্তর:


88

সি ++ এ আপনি নিজের বৈশিষ্ট্যগুলি লিখতে পারেন। এখানে নামহীন ক্লাস ব্যবহার করে সম্পত্তিগুলির বাস্তবায়ন উদাহরণ। উইকিপিডিয়া নিবন্ধ

struct Foo
{
    class {
        int value;
        public:
            int & operator = (const int &i) { return value = i; }
            operator int () const { return value; }
    } alpha;

    class {
        float value;
        public:
            float & operator = (const float &f) { return value = f; }
            operator float () const { return value; }
    } bravo;
};

আপনি নিজের গেটার এবং সেটটারগুলিকে জায়গায় লিখতে পারেন এবং আপনি যদি ধারক শ্রেণীর সদস্য অ্যাক্সেস চান তবে আপনি এই উদাহরণ কোডটি প্রসারিত করতে পারেন।


4
কীভাবে এই কোডটি সংশোধন করতে হবে তার কোনও ব্যক্তিগত সদস্যের ভেরিয়েবল এমন কী থাকতে পারে যা ফু অভ্যন্তরীণভাবে অ্যাক্সেস করতে পারে, যখন পাবলিক এপিআই কেবল সম্পত্তি প্রকাশ করে? আমি অবশ্যই ফুকে আলফা / বিটার বন্ধু হিসাবে গড়ে তুলতে পারি, তবে তারপরেও মানটি অ্যাক্সেস করার জন্য আমাকে আলফা.মূল্য লিখতে হবে, তবে আমি বরং পছন্দ করব যদি ফু এর ভিতর থেকে সরাসরি সদস্যের ভেরিয়েবলটি অ্যাক্সেস করা আরও ভাল লাগে feel নিজেই ফু এর সদস্য অ্যাক্সেস করা এবং কোনও বিশেষ নেস্টেড সম্পত্তি শ্রেণীর সদস্য নয়।
কাইসারলুদি

4
@ কাইসারলুদি হ্যাঁ: এই ক্ষেত্রে, আলফা এবং ব্রাভোকে ব্যক্তিগত করুন। ফু-তে আপনি উপরের সেই "বৈশিষ্ট্যগুলি" দিয়ে পড়তে / লিখতে পারেন তবে ফু এর বাইরে এটি আর সম্ভব হবে না। এটির জন্য, জনসাধারণের কাছে একটি দৃ const় রেফারেন্স তৈরি করুন। এটি বাইরে থেকে অ্যাক্সেসযোগ্য তবে কেবল পড়ার জন্য এটি এটি একটি ধ্রুবক উল্লেখ। একমাত্র সতর্কতা হ'ল জনসাধারণের কনস্ট রেফারেন্সের জন্য আপনার আর একটি নাম প্রয়োজন। আমি ব্যক্তিগতভাবে _alphaব্যক্তিগত ভেরিয়েবল এবং alphaরেফারেন্সের জন্য ব্যবহার করব।
কাপিচু

4
@ কাপিচু: 2 কারণে সমাধান নয় not 1) সি # প্রোপার্টি গেটার / সেটটারগুলি প্রায়শই নিরাপদ চেকগুলি এম্বেড করতে ব্যবহৃত হয় যা সদস্যের ফাংশনগুলিকে সরাসরি মানটি অ্যাক্সেস করার অনুমতি দেওয়ার জন্য শ্রেণীর পাবলিক ব্যবহারকারীদের বাধ্য হয়। 2) কনস্টের রেফারেন্সগুলি নিখরচায় নয়: সংকলক / প্ল্যাটফর্মের উপর নির্ভর করে তারা বড় করবে sizeof(Foo)
ceztko

@ পিএক্সএক্স: এই পদ্ধতির সীমাবদ্ধতার কারণে, আমি এটিকে এড়াতে চাই এবং যদি এটি কখনও প্রদর্শিত হয় তবে মানের সাথে যথাযথ সংযোজনের জন্য অপেক্ষা করতাম।
ceztko

@ কাপিচু: তবে উদাহরণ কোডে আলফা এবং ব্রাভো হ'ল বৈশিষ্ট্য। আমি কোনও সম্পত্তি ব্যবহারের প্রয়োজন ছাড়াই ফু এর প্রয়োগের অভ্যন্তর থেকে সরাসরি চলকটি অ্যাক্সেস করতে চাই, আমি কেবলমাত্র এপিআই-তে কোনও সম্পত্তি ব্যবহার করে এক্সেস প্রকাশ করতে চাই।
কাইসরুদ্দি

56

সি ++ এর মধ্যে এটি অন্তর্নির্মিত নেই, আপনি বৈশিষ্ট্য কার্যকারিতা নকল করতে একটি টেমপ্লেট সংজ্ঞায়িত করতে পারেন :

template <typename T>
class Property {
public:
    virtual ~Property() {}  //C++11: use override and =default;
    virtual T& operator= (const T& f) { return value = f; }
    virtual const T& operator() () const { return value; }
    virtual explicit operator const T& () const { return value; }
    virtual T* operator->() { return &value; }
protected:
    T value;
};

একটি সম্পত্তি সংজ্ঞায়িত করতে :

Property<float> x;

একটি কাস্টম গেটার / সেটার বাস্তবায়নের জন্য উত্তরাধিকার সূত্রে:

class : public Property<float> {
    virtual float & operator = (const float &f) { /*custom code*/ return value = f; }
    virtual operator float const & () const { /*custom code*/ return value; }
} y;

একটি নির্ধারণ করতে শুধুমাত্র পাঠযোগ্য সম্পত্তি :

template <typename T>
class ReadOnlyProperty {
public:
    virtual ~ReadOnlyProperty() {}
    virtual operator T const & () const { return value; }
protected:
    T value;
};

এবং এটি ক্লাসে ব্যবহার করতেOwner :

class Owner {
public:
    class : public ReadOnlyProperty<float> { friend class Owner; } x;
    Owner() { x.value = 8; }
};

এটিকে আরও সংক্ষিপ্ত করতে আপনি উপরের কয়েকটিকে ম্যাক্রোতে সংজ্ঞায়িত করতে পারেন।


আমি কৌতূহলী হয়েছি যদি এটি একটি শূন্য-দামের বৈশিষ্ট্যটিতে সংকলিত হয়, তবে আমি জানি না যে কোনও ডেটা-সদস্যকে কোনও শ্রেণীর উদাহরণে মোড়ানো করার ফলে একই ধরণের কাঠামো-প্যাকিংয়ের ফলস্বরূপ ঘটে।
দাই

4
"কাস্টম গেটর / সেটার" যুক্তিটি ল্যাম্বডা ফাংশনগুলি ব্যবহার করে সিনট্যাক্টিক্যালি ক্লিনার তৈরি করা যেতে পারে, দুর্ভাগ্যক্রমে আপনি সি ++ (এখনও!) এ এক্সিকিউটেবল প্রসঙ্গের বাইরে ল্যাম্বডাকে সংজ্ঞায়িত করতে পারবেন না সুতরাং প্রিপ্রসেসর ম্যাক্রো ব্যবহার না করে আপনি কেবল কোডটি দিয়ে শেষ করেন just নির্লিপ্তভাবে বোবা getters / setters হিসাবে, যা দুর্ভাগ্যজনক।
দাই

4
শেষ উদাহরণে "শ্রেণি ... ..." আকর্ষণীয় এবং অন্যান্য উদাহরণ থেকে অনুপস্থিত। এটি একটি নতুন শ্রেণীর নাম পরিচয় না দিয়ে - প্রয়োজনীয় বন্ধু-ঘোষণা তৈরি করে।
হ্যানস ওলসন

এটির এবং 2010-নভেম্বর-19 উত্তরের মধ্যে একটি বড় পার্থক্য হ'ল এটি কেস-কেস-কেস ভিত্তিতে গেটর বা সেটটারকে ওভাররাইড করতে সক্ষম করে। এইভাবে কেউ ইনপুটটি পরিসীমাতে থাকতে পারে, বা ইভেন্ট শ্রোতাদের পরিবর্তন করতে একটি পরিবর্তন বিজ্ঞপ্তি পাঠাতে পারে বা ব্রেকপয়েন্টটি স্থির রাখতে পারে।
এলজাই

নোট করুন যে বেশিরভাগ ব্যবহারের ক্ষেত্রে virtualএটি সম্ভবত অপ্রয়োজনীয়, যেহেতু কোনও সম্পত্তি বহুবিকভাবে ব্যবহারের সম্ভাবনা নেই।
এলজে

28

সি ++ ভাষায় এমন কোনও কিছুই নেই যা সমস্ত প্ল্যাটফর্ম এবং সংকলক জুড়ে কাজ করবে।

তবে আপনি যদি ক্রস প্ল্যাটফর্মের সামঞ্জস্যতা ভঙ্গ করতে এবং নির্দিষ্ট সংকলককে প্রতিশ্রুতিবদ্ধ করতে ইচ্ছুক হন তবে আপনি এই জাতীয় বাক্য গঠন ব্যবহার করতে সক্ষম হতে পারেন, উদাহরণস্বরূপ মাইক্রোসফ্ট ভিজ্যুয়াল সি ++ এ আপনি এটি করতে পারেন

// declspec_property.cpp  
struct S {  
   int i;  
   void putprop(int j) {   
      i = j;  
   }  

   int getprop() {  
      return i;  
   }  

   __declspec(property(get = getprop, put = putprop)) int the_prop;  
};  

int main() {  
   S s;  
   s.the_prop = 5;  
   return s.the_prop;  
}


18

আপনি ডেডিকেটেড টাইপ একজন সদস্য থাকার এবং অগ্রাহ্য দ্বারা কিছুটা হলেও গেটার এবং সেটার অনুকরণ করতে operator(type)এবং operator=তার জন্য। এটি একটি ভাল ধারণা অন্য প্রশ্ন এবং আমি +1আমার মতামত প্রকাশের জন্য কেরেক এসবি এর উত্তর যাচ্ছি :)


আপনি এ জাতীয় ধরণটি পাঠিয়ে বা পড়ার সময় কোনও পদ্ধতির কলিং অনুকরণ করতে পারেন তবে কে বোঝায় যে কার্য সম্পাদনকে কল করে (এটি ক্ষেত্রের মালিক না হলে এটি নিষিদ্ধ করতে) - আমি বিভিন্ন অ্যাক্সেস নির্দিষ্ট করে যা করার চেষ্টা করছি গেটর এবং সেটারের জন্য স্তর
রদিম ভানসা

@ ফ্লাভিয়াস: কেবলমাত্র friendক্ষেত্রের মালিককে একটি যুক্ত করুন ।
কেনেটিএম

17

আমি শেষ ঘন্টাগুলিতে জমা হওয়া সম্পত্তি শ্রেণীর দিকে একবার নজর দিন: /codereview/7786/c11-feedback-on-my-approach-to-c- Like-class- properties

এটি আপনাকে এমন বৈশিষ্ট্যগুলির সাথে আচরণ করার অনুমতি দেয়:

CTestClass myClass = CTestClass();

myClass.AspectRatio = 1.4;
myClass.Left = 20;
myClass.Right = 80;
myClass.AspectRatio = myClass.AspectRatio * (myClass.Right - myClass.Left);

দুর্দান্ত, তবে এটি ব্যবহারকারীর দ্বারা সংজ্ঞায়িত অ্যাক্সেসরদের অনুমতি দেয় এমন পাবলিক গেটর / প্রাইভেট সেটার বৈশিষ্ট্যটি আমি সন্ধান করছি না।
রদিম ভানসা

17

সি ++ 11 দিয়ে আপনি একটি সম্পত্তি শ্রেণির টেমপ্লেট সংজ্ঞায়িত করতে এবং এটি ব্যবহার করতে পারেন:

class Test{
public:
  Property<int, Test> Number{this,&Test::setNumber,&Test::getNumber};

private:
  int itsNumber;

  void setNumber(int theNumber)
    { itsNumber = theNumber; }

  int getNumber() const
    { return itsNumber; }
};

এবং এখানে সম্পত্তি শ্রেণীর টেম্পলেট।

template<typename T, typename C>
class Property{
public:
  using SetterType = void (C::*)(T);
  using GetterType = T (C::*)() const;

  Property(C* theObject, SetterType theSetter, GetterType theGetter)
   :itsObject(theObject),
    itsSetter(theSetter),
    itsGetter(theGetter)
    { }

  operator T() const
    { return (itsObject->*itsGetter)(); }

  C& operator = (T theValue) {
    (itsObject->*itsSetter)(theValue);
    return *itsObject;
  }

private:
  C* const itsObject;
  SetterType const itsSetter;
  GetterType const itsGetter;
};

4
কি C::*মানে? আমি এর আগে এর আগে কিছু দেখিনি?
রিকা

4
এটি ক্লাসে একটি অ স্থিতিশীল সদস্য ফাংশনের পয়েন্টার C। এটি একটি সরল ফাংশন পয়েন্টারের অনুরূপ তবে সদস্য ফাংশনটি কল করার জন্য আপনাকে একটি অবজেক্ট সরবরাহ করতে হবে যার উপর ফাংশনটি বলা হয়। itsObject->*itsSetter(theValue)উপরের উদাহরণে লাইনটি দিয়ে এটি অর্জন করা হয়েছে । এই বৈশিষ্ট্যটির আরও বিশদ বিবরণের জন্য এখানে দেখুন ।
ক্রিস্টোফ বোহমে

@ নাইসম্যান, ব্যবহারের কোনও উদাহরণ আছে? সদস্য হিসাবে থাকা খুব ব্যয়বহুল বলে মনে হয়। এটি কোনও স্থির সদস্য হিসাবে বিশেষভাবে কার্যকর নয়।
গ্রিম ফান্ডাঙ্গো

16

অন্যান্য অনেকে ইতিমধ্যে বলে গেছেন, ভাষার কোনও অন্তর্নির্মিত সমর্থন নেই। তবে, আপনি যদি মাইক্রোসফ্ট সি ++ সংকলকটিকে লক্ষ্য করে থাকেন তবে আপনি এখানে নথিবদ্ধ বৈশিষ্ট্যগুলির জন্য মাইক্রোসফ্ট-নির্দিষ্ট এক্সটেনশনের সুবিধা নিতে পারেন

লিঙ্কযুক্ত পৃষ্ঠা থেকে এটি উদাহরণ:

// declspec_property.cpp
struct S {
   int i;
   void putprop(int j) { 
      i = j;
   }

   int getprop() {
      return i;
   }

   __declspec(property(get = getprop, put = putprop)) int the_prop;
};

int main() {
   S s;
   s.the_prop = 5;
   return s.the_prop;
}

12

না, সি ++ এর বৈশিষ্ট্যের কোনও ধারণা নেই। যদিও এটি getThis () বা সেটট্যাট (মান) নির্ধারণ করতে এবং কল করা অদ্ভুত হতে পারে তবে আপনি সেই পদ্ধতিগুলির গ্রাহককে একটি বিবৃতি দিচ্ছেন যে কিছু কার্যকারিতা দেখা দিতে পারে। অন্যদিকে সি ++ তে ক্ষেত্রগুলি অ্যাক্সেস করা গ্রাহককে বলে যে কোনও অতিরিক্ত বা অপ্রত্যাশিত কার্যকারিতা ঘটবে না। প্রথম নজরে সম্পত্তি অ্যাক্সেস ক্ষেত্রের মতো প্রতিক্রিয়া দেখা দেয় বলে বৈশিষ্ট্যগুলি এটিকে কম স্পষ্ট করে তোলে।

অন্যদিকে, আমি একটি নেট অ্যাপ্লিকেশন (একটি খুব সুপরিচিত সিএমএস) গ্রাহক সদস্যপদ ব্যবস্থা তৈরির চেষ্টা করে কাজ করছিলাম। তারা যেভাবে তাদের ব্যবহারকারীর সামগ্রীর জন্য সম্পত্তি ব্যবহার করেছিল তার কারণে ক্রিয়াগুলি আমার দ্বারা প্রত্যাশিত ছিল না তা ছড়িয়ে পড়েছিল, যার ফলে আমার প্রয়োগগুলি অসীম পুনরাবৃত্তি সহ উদ্ভট উপায়ে সম্পাদন করে। স্ট্রিটএড্রেস-এর মতো সাধারণ জিনিসগুলিতে অ্যাক্সেস করার চেষ্টা করার সময় তাদের ব্যবহারকারীর অবজেক্টগুলি ডেটা অ্যাক্সেস স্তর বা কিছু বিশ্বব্যাপী ক্যাচিং সিস্টেমে কল করেছিল। তাদের সম্পত্তি পুরোপুরি প্রতিষ্ঠিত হয়েছিল যা আমি সম্পত্তিগুলির অপব্যবহার বলব on যদি তারা সম্পত্তিগুলির পরিবর্তে পদ্ধতি ব্যবহার করে থাকে তবে আমি মনে করি যে আমি কী খুব বেশি ভুল হচ্ছে তা বুঝতে পারতাম। যদি তারা ক্ষেত্র ব্যবহার করে (বা কমপক্ষে তাদের সম্পত্তিগুলি ক্ষেত্রের মতো আচরণ করে) তবে আমি মনে করি সিস্টেমটি প্রসারিত এবং বজায় রাখা আরও সহজ হত।

[সম্পাদনা] আমার চিন্তাভাবনা পরিবর্তন করেছে। আমার খুব খারাপ দিন ছিল এবং কিছুটা ভাঁড়িতে গিয়েছিলাম। এই ক্লিনআপটি আরও পেশাদার হতে হবে।



4

এটি ঠিক কোনও সম্পত্তি নয়, তবে এটি আপনি যা সহজ উপায় চান তা করে:

class Foo {
  int x;
public:
  const int& X;
  Foo() : X(x) {
    ...
  }
};

এখানে বড় এক্স public int X { get; private set; }সি # সিনট্যাক্সের মতো আচরণ করে । আপনি যদি পূর্ণ-বিকাশযুক্ত বৈশিষ্ট্য চান তবে এগুলি এখানে প্রয়োগ করার জন্য আমি প্রথম শট তৈরি করেছি ।


4
এটি একটি ভাল ধারণা নয়। আপনি যখনই এই শ্রেণীর কোনও বস্তুর অনুলিপি তৈরি Xকরবেন, তখনও নতুন বস্তুর উল্লেখটি পুরানো অবজেক্টটির সদস্যকে নির্দেশ করবে কারণ এটি কেবল পয়েন্টার সদস্যের মতো অনুলিপি করা হয়েছে। এটি নিজের মধ্যে খারাপ, কিন্তু যখন পুরানো অবজেক্টটি মুছে ফেলা হয়, আপনি এটির উপরে মেমরির দুর্নীতি পান। এই কাজটি করতে, আপনাকে নিজের কপি কনস্ট্রাক্টর, এসাইনমেন্ট অপারেটর এবং মুভ কনস্ট্রাক্টরও প্রয়োগ করতে হবে।
টুস্টার

4

আপনি সম্ভবত এটি জানেন তবে আমি কেবল নিম্নলিখিতগুলি করব:

class Person {
public:
    std::string name() {
        return _name;
    }
    void name(std::string value) {
        _name = value;
    }
private:
    std::string _name;
};

এই পদ্ধতিটি সহজ, কোনও চালাক কৌশল ব্যবহার করে না এবং এটি কাজটি সম্পন্ন করে!

যদিও বিষয়টি হ'ল কিছু লোক তাদের ব্যক্তিগত ক্ষেত্রগুলিকে একটি আন্ডারস্কোর দিয়ে উপস্থাপন করতে পছন্দ করেন না এবং তাই তারা সত্যই এই পদ্ধতিকে ব্যবহার করতে পারবেন না, তবে ভাগ্যক্রমে যারা এইগুলি করেন তাদের পক্ষে এটি সত্যই সোজা। :)

গেট অ্যান্ড সেট উপসর্গগুলি আপনার এপিআইতে স্বচ্ছতা যুক্ত করে না তবে এগুলি আরও ভার্জোজ করে তোলে এবং যে কারণে তারা কার্যকর তথ্য যুক্ত করে বলে আমি মনে করি না কারণ যখন কোনও এপিআই ব্যবহার করার প্রয়োজন হয় যদি এপিআই বোঝায় তবে সে সম্ভবত এটি বুঝতে পারে কি উপসর্গ ছাড়া করে।

আরও একটি বিষয়, এটি উপলব্ধি করা সহজ যে এগুলি বৈশিষ্ট্য কারণ nameক্রিয়াপদ নয়।

সবচেয়ে খারাপ পরিস্থিতি, যদি API গুলি সামঞ্জস্যপূর্ণ হয় এবং ব্যক্তিটি বুঝতে পারে না যে name()এটি একজন অ্যাক্সেসর এবং name(value)একটি মিউটেটর হয় তবে প্যাটার্নটি বোঝার জন্য তাকে কেবল ডকুমেন্টেশনে একবার এটি দেখতে হবে।

আমি যতটা সি সি ভালবাসি আমার মনে হয় না সি ++ এর জন্য মোটেই প্রপার্টি দরকার!


আপনার মিউটররা যদি বোঝায় যে কেউ যদি foo(bar)( ধীরের পরিবর্তে foo = bar) ব্যবহার করে তবে আপনার অ্যাক্সেসরগুলির বৈশিষ্ট্যগুলির সাথে কিছু করার নেই ...
ম্যাথিয়াস

@ মাথিয়াস উল্লেখ করে বলেছেন যে এর সাথে সম্পত্তির কোনও যোগসূত্র নেই, আমাকে কিছু বলেন না, আপনি কি বিস্তারিত বলতে পারবেন? তাছাড়া আমি তাদের তুলনা করার চেষ্টা করিনি তবে আপনার যদি কোনও মিউটর এবং অ্যাকসেসরের প্রয়োজন হয় তবে আপনি এই সম্মেলনটি ব্যবহার করতে পারেন।
এয়াল সলনিক

প্রশ্ন সম্পত্তি সম্পর্কিত সফ্টওয়্যার ধারণা সম্পর্কে। বৈশিষ্ট্যগুলি ব্যবহার করা যেতে পারে যেমন তারা জনসাধারণের ডেটা সদস্য (ব্যবহার) তবে সেগুলি আসলে বিশেষ পদ্ধতি যা অ্যাকসেসর (ঘোষণাপত্র) বলে। আপনার সমাধান ঘোষণা এবং ব্যবহারের জন্য পদ্ধতিগুলিতে (সাধারণ গেটার / সেটটার) আটকে রয়েছে। সুতরাং এটি প্রথমে, ওপি অবশ্যই স্পষ্টভাবে ব্যবহারের জন্য নয়, বরং কিছু অদ্ভুত এবং অপ্রচলিত নামকরণের কনভেনশন (এবং এইভাবে দ্বিতীয়ত, কোনও সিনট্যাকটিক চিনিও নেই)।
ম্যাথিয়াস

একটি সামান্য পার্শ্ব প্রতিক্রিয়া হিসাবে, আপনার পরিবর্তনকারী আশ্চর্যজনকভাবে একটি সম্পত্তি হিসাবে কাজ করে, যেহেতু সি ++ এ foo(bar)পরিবর্তে কোনও সদস্যের পরিবর্তনশীলতে foo=barকোনও void foo(Bar bar)মিউটর পদ্ধতিতে অর্জন করা যায় তার পরিবর্তে একটি সেরা সূচনা হয় _foo
ম্যাথিয়াস

@ মাথিয়াস আমি জানি বৈশিষ্ট্যগুলি কী, আমি এক দশক ধরে সি ++ কে অনেকটা লিখে সি # লিখছি, আমি সম্পত্তিগুলির সুবিধাগুলি এবং সেগুলি কী তা নিয়ে তর্ক করছি না তবে সত্যই আপনি কখনই সি -+ এ তাদের প্রয়োজন হয়নি you 'তারা বলছে যে এগুলি জনসাধারণের ডেটা হিসাবে ব্যবহার করা যেতে পারে এবং এটি বেশিরভাগ ক্ষেত্রেই সত্য তবে সি # তে এমন কিছু ক্ষেত্রে রয়েছে যেখানে আপনি সরাসরি সম্পত্তি ব্যবহার করতে পারবেন না, যেমন কোনও পাবলিক ফিল্ডের সাথে রেফারেন্স দিয়ে কোনও সম্পত্তি পাস করার মতো আপনি পারেন।
ইয়াল সলনিক

4

না না .. তবে আপনার বিবেচনা করা উচিত যে এটি ঠিক পাওয়া যায় কিনা: সেট ফাংশন এবং কোনও অতিরিক্ত টাস্কের অভ্যন্তরীণ পূর্বরূপ পাওয়া না: সেট পদ্ধতিগুলি কেবল এটি সর্বজনীন করে তোলে।


2

আমি একাধিক সি ++ উত্স থেকে ধারণাগুলি সংগ্রহ করেছি এবং এটিকে একটি দুর্দান্ত, সি ++ তে গেটার / সেটারদের জন্য এখনও বেশ সহজ উদাহরণে রেখেছি:

class Canvas { public:
    void resize() {
        cout << "resize to " << width << " " << height << endl;
    }

    Canvas(int w, int h) : width(*this), height(*this) {
        cout << "new canvas " << w << " " << h << endl;
        width.value = w;
        height.value = h;
    }

    class Width { public:
        Canvas& canvas;
        int value;
        Width(Canvas& canvas): canvas(canvas) {}
        int & operator = (const int &i) {
            value = i;
            canvas.resize();
            return value;
        }
        operator int () const {
            return value;
        }
    } width;

    class Height { public:
        Canvas& canvas;
        int value;
        Height(Canvas& canvas): canvas(canvas) {}
        int & operator = (const int &i) {
            value = i;
            canvas.resize();
            return value;
        }
        operator int () const {
            return value;
        }
    } height;
};

int main() {
    Canvas canvas(256, 256);
    canvas.width = 128;
    canvas.height = 64;
}

আউটপুট:

new canvas 256 256
resize to 128 256
resize to 128 64

আপনি এটি অনলাইনে এখানে পরীক্ষা করতে পারেন: http://codepad.org/zosxqjTX


স্ব-রেফারেন্সগুলি রাখার জন্য একটি মেমরির ওভারহেড রয়েছে, + একটি আওয়ারওয়ার কর্টর সিনট্যাক্স।
রেড.ওয়েভ

সম্পত্তি প্রস্তাব করতে? আমি অনুমান করি যে এই জাতীয় প্রস্তাবগুলির একগুচ্ছ প্রত্যাখাত হয়েছে।
রেড.ওয়েভ

@ রেড.ভ্যাভ তখন প্রত্যাখাত কর্তা এবং কর্তাকে প্রণাম করুন। C ++ এ আপনাকে স্বাগতম। যদি আপনি স্ব-রেফারেন্স না চান তবে কলং এবং এমএসভিসির বৈশিষ্ট্যগুলির জন্য কাস্টম এক্সটেনশন রয়েছে।
lama12345

আমি কখনই মাথা নত করতে পারি না। আমি মনে করি প্রতিটি বৈশিষ্ট্য এমনকি appropariate হয় না। আমার কাছে অবজেক্টস সেটার + গিটার ফাংশনগুলির এক জোড়ায়ের চেয়ে অনেক বেশি। আমি অপ্রয়োজনীয় স্থায়ী মেমরির ওভারহেড এড়িয়ে নিজস্ব বাস্তবায়নগুলি চেষ্টা করেছি, তবে উদাহরণগুলি বাক্য গঠনের বাক্য গঠন এবং কাজ সন্তোষজনক ছিল না; আমি ঘোষিত ম্যাক্রোগুলি ব্যবহার করার প্রতি আকৃষ্ট হয়েছিল, তবে আমি কোনওভাবেই ম্যাক্রোগুলির বড় অনুরাগী নই। এবং আমার পদ্ধতির অবশেষে, ফাংশন সিনট্যাক্সের মাধ্যমে পোর্টপার্টিগুলি অ্যাক্সেস করেছিল, যা আমার সহ অনেকেই অনুমোদন করে না।
Red.Wave

0

আপনার শ্রেণীর কি সত্যই কিছু আক্রমণকারী প্রয়োগ করা দরকার বা এটি কেবল সদস্য উপাদানগুলির একটি যৌক্তিক গোষ্ঠীকরণ? যদি এটি পরে হয় তবে আপনার জিনিসটিকে কাঠামো তৈরি করা এবং সরাসরি সদস্যদের অ্যাক্সেস করা উচিত consider


0

লিখিত ম্যাক্রো একটি সেট আছে এখানে । এটির মান ধরণের, রেফারেন্সের ধরণের, কেবল পঠনযোগ্য প্রকারের, শক্তিশালী এবং দুর্বল প্রকারের জন্য উপযুক্ত সম্পত্তি ঘোষণা রয়েছে।

class MyClass {

 // Use assign for value types.
 NTPropertyAssign(int, StudentId)

 public:
 ...

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.