আমরা স্ট্রাক্টে কনস্ট্রাক্টর যুক্ত করব?


14

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

আমরা প্রায়শই কেবল তথ্য সত্তা হিসাবে স্ট্রাক্টগুলি ব্যবহার / চিকিত্সা করার ফলে এই তাগিদ তৈরি হয় যে আমরা ডিফল্ট নির্মাণকারীদেরও যুক্ত না করি। তবে কনস্ট্রাক্টররা সর্বদা দুর্দান্ত, তারা জিনিসগুলিকে সহজ করে এবং ত্রুটিগুলি দূর করতে সহায়তা করে।

আমার ডেটা স্ট্রাকচারে ডিফল্ট কনস্ট্রাক্টর যুক্ত করলে কি তা ভ্রান্ত হবে?

ডিফল্ট কনস্ট্রাক্টর বাস্তবায়ন কি স্ট্রাক্ট নন-পিওডি (প্লেইন পুরাতন ডেটা টাইপ) সরবরাহ করে অন্য মানদণ্ড পূরণ হয়?

জিনিসগুলিকে দৃষ্টিভঙ্গিতে রাখতে, একটি সাধারণ উদাহরণ বিবেচনা করুন তবে বাস্তবে কাঠামোটি আরও বড় হবে be

struct method
{
    char    name[32];
    float   temperature;
    int     duration;
};

আমি যখনই কোনও পদ্ধতি তৈরি করি, তখন আমি কিছুটা মূল্য নির্ধারণ করতে ভুলে গেলে আমাকে (কমপক্ষে বলতে হবে) সম্পর্কে চিন্তা করতে হবে। কল্পনা করুন আমি temperatureসিস্টেমে পদ্ধতিটি সেট এবং প্রয়োগ করতে ভুলে গেছি যা এখন এলোমেলো উচ্চ মানের এবং মায়ামের কারণ হয়ে দাঁড়ায়। বা আমি সেট করতে ভুলে গিয়েছি durationএবং এখন পদ্ধতিটি অজানা উচ্চতর সময়ের জন্য নিজেকে প্রয়োগ করে।

আমি কেন তার গ্যারান্টিযুক্ত কনস্ট্রাক্টর বাস্তবায়নের পরিবর্তে প্রতিবার অবজেক্টটি আরম্ভ করার দায়িত্ব নেব?


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

এটি নির্ভর করে এই নির্মাতারা কী করছেন। আমি মনে করি এটি যদি সাধারণভাবে ক্ষেত্রের মানগুলি বেসিক উপায়ে সেট করে থাকে তবে একটি সাধারণ কাঠামোতে কোনও কনস্ট্রাক্টর থাকা সম্পূর্ণ যুক্তিসঙ্গত।
রোবট

@ এই প্রশ্নটি নয়, আমি পোস্টটি আপডেট করেছি। স্টিভেন: হ্যাঁ কনস্ট্রাক্টররা কেবলমাত্র ডিফল্ট মান নির্ধারণ করবে।
জাদানে

@ স্টিভেন বার্নাপ: যদি কনস্ট্রাক্টর মৌলিক উপায়ে ক্ষেত্রের মান নির্ধারণের চেয়ে আরও কিছু করেন তবে তা কেবল এটি রাখা আরও উপযুক্ত। এমনকি একটি কাঠামো উপর।
জানু হুডেক

2
আমার অর্থ হ'ল, যদি আপনি কনস্ট্রাক্টরে জটিল যুক্তি সন্ধান শুরু করেন তবে সম্ভবত এটি এটিকে একটি শ্রেণিতে পরিণত করা উচিত। (আইএমএইচও) তবে এটির মধ্যে কেবল প্রকৃত পার্থক্য হিসাবে এটি কেবল একটি স্টাইলের প্রশ্ন structএবং classএটি হ'ল একটি ব্যক্তিগত এবং অন্যটি জনসাধারণের কাছে খেলাপি।
রোবট

উত্তর:


13

কখনও কখনও এটি স্ট্রাক্টে কনস্ট্রাক্টর যুক্ত করা উপযুক্ত এবং কখনও কখনও এটি হয় না।

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

কনস্ট্রাক্টর (আবার কোনও কনস্ট্রাক্টর) যুক্ত করা এটিকে পিওডি-র বিহীন করে তোলে, তবে সি ++ ১১-এ বেশিরভাগ নিয়মই POD- র ক্ষেত্রে আগে প্রয়োগ করা হয়েছিল কেবলমাত্র স্ট্যান্ডার্ড লেআউট অবজেক্টে প্রয়োগ করার জন্য এবং কনস্ট্রাক্টর যুক্ত করার ফলে এটি ভঙ্গ হয় না। সুতরাং সমষ্টিগত সূচনাটি হ'ল মূলত আপনি হারাতে পারেন। তবে এটি প্রায়শই বড় ক্ষতি হয়।



-1

দ্রুত উত্তর:

এটি আপনি কী অর্জন করতে চান তার উপর নির্ভর করে।

দীর্ঘ, প্রসারিত, বিরক্তিকর উত্তর:

আপনি পেরেক আঘাত।

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

তবুও, আমি সম্মত হই যে কিছু মৌলিক সাধারণ অপারেশন, যেমন:

  • প্রাথমিক মান নির্ধারণ করুন ("কনস্ট্রাক্টর")
  • কাঠামোর একটি অনুলিপি তৈরি করুন ("অনুলিপি নির্মাণকারী)
  • একটি বিদ্যমান কাঠামোতে মান নির্ধারণ করুন ("ওভারলোড অ্যাসাইনেট অপারেটর")

প্রয়োজন হয় এবং এই পরিস্থিতিতে কাঠামোর জন্য পদ্ধতিগুলি বোধগম্য হয়।

প্রস্তাবনা

আর একটি সম্ভাব্য সমাধান হ'ল পিওডি স্ট্রাকচার ব্যবহার করা, তবে, তবুও তাদের ধারণাগতভাবে শ্রেণি এবং অবজেক্ট হিসাবে বিবেচনা করুন।

সর্বাধিক গুরুত্বপূর্ণ ক্রিয়াকলাপের জন্য এই ঘোষণাগুলি একটি নেমস্পেসে মুড়িয়ে রাখুন এবং গ্লোবাল ফাংশন যুক্ত করুন।

কোড ঘোষণাটি এর অনুরূপ হতে পারে:

namespace Customers
{
  struct CustomerStruct
  {
    char[255] FirstName;
    char[255] LastName;
    int Age;
    bool IsAlive;
    bool IsMarried;
  }; // struct

  CustomerStruct* CreateCustomer
  (
    char* NewFirstName;
    char* NewLastName;
    int NewAge;
    bool NewIsAlive;
    bool NewIsMarried;
  )
  {
    CustomerStruct* NewCustomer = new CustomerStruct();
      NewCustomer->FirstName = NewFirstName;
      NewCustomer->LastName = NewLastName;
      NewCustomer->Age = NewAge;
      NewCustomer->IsAlive = NewIsAlive;
      NewCustomer->IsMarried = NewIsMarried;
    return NewCustomer;
  } // CustomerStruct* CreateCustomer (...)

} // namespace

সমাধানটি প্রয়োগ করে এমন কোডটি এরকম কিছু হতে পারে:

#include <Customers>

using Customers;

int main (...)
{
   int ErrorCode = 0;

   CustomerClass* ThisCustomer =
     Customers::CreateCustomer
      ("John", "Doe", 23, true, true);

   // do something with "ThisCustomer"

   delete ThisCustomer;

   return ErrorCode;
} // int main(...)

এই বিকল্প পদ্ধতির আরও ভাল যখন ডেটা একটি বিশাল মেমরি বরাদ্দ প্রয়োজন হয়, বা অন্যান্য নিম্ন স্তরের ভাগ করা লাইব্রেরি সাথে ইন্টারেক্ট করা হয়।

কিছু পরিবর্তন সহ এই পদ্ধতির গেম ডেভলপমেন্টে প্রয়োগ করা হয়।

অতিরিক্ত

ব্যক্তিগতভাবে, আমি "সি ++" বা এমনকি একটি নতুন "সি ++" ভিত্তিক পিএল এর জন্য একটি সিনট্যাক্স এক্সটেনশন বিবেচনা করি যা এই সমস্যাটি সমাধান করে:

// "Plain Old Data" Structure
// No Methods, No "Functors", allowed
strict struct CustomerStruct
{
  char[255] FirstName;
  char[255] LastName;
  int Age;
  bool IsAlive;
  bool IsMarried;
}; // strict struct

// Object Oriented "Plain Old Data" Structure
// Yes, Methods and "Functors" allowed
relaxed struct CustomerStruct
{
  char[255] FirstName;
  char[255] LastName;
  int Age;
  bool IsAlive;
  bool IsMarried;

  public void Foo();
  public void Bar();

  public (void*) (SomeFunctor) ();
}; // relaxed struct

// Class and Object Oriented
class CustomerClass
{
  public char[255] FirstName;
  public char[255] LastName;
  public int Age;
  public bool IsAlive;
  public bool IsMarried;

  public void Foo();
  public void Bar();
}; // class

চিয়ার্স।

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