ইঞ্জিনের উপাদানগুলির জন্য কনস্ট্রাক্টর এবং ডেস্ট্রাক্টরে যুক্তি স্থাপনের পরিবর্তে আমি কেন পৃথক আরম্ভ এবং পদ্ধতি পরিষ্কার করব?


9

আমি আমার নিজের গেম ইঞ্জিনে কাজ করছি, এবং আমি বর্তমানে আমার পরিচালকদের ডিজাইন করছি। আমি পড়েছি যে মেমরি পরিচালনার জন্য ব্যবহার Init()এবং CleanUp()ফাংশন ভাল তারপর কনস্ট্রাকটর এবং destructors ব্যবহার করছেন।

আমি সি ++ কোড উদাহরণগুলি সন্ধান করছি, সেই ফাংশনগুলি কীভাবে কাজ করে এবং কীভাবে আমি সেগুলি আমার ইঞ্জিনে প্রয়োগ করতে পারি see কীভাবে Init()এবং CleanUp()কাজ করে এবং আমি কীভাবে এগুলি আমার ইঞ্জিনে প্রয়োগ করতে পারি?



সি ++ এর জন্য, স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / ৩78৮68৮৫৫৩/২ দেখুন। ইনস () ব্যবহারের মূল কারণগুলি হ'ল সাহায্যকারী ফাংশন সহ কনস্ট্রাক্টরে ব্যতিক্রম এবং ক্র্যাশগুলি রোধ করুন 2) উত্পন্ন শ্রেণি থেকে ভার্চুয়াল পদ্ধতি ব্যবহার করতে সক্ষম হওয়া 3) সার্কুলার সার্কুলার নির্ভরতা 4) কোড
সদৃশতা

উত্তর:


12

এটি বেশ সহজ, আসলে:

কোনও কনস্ট্রাক্টর রাখার পরিবর্তে যা আপনার সেটআপ করে,

// c-family pseudo-code
public class Thing {
    public Thing (a, b, c, d) { this.x = a; this.y = b; /* ... */ }
}

... আপনার কনস্ট্রাক্টরকে কিছু কম বা কিছু করতে দিন এবং একটি পদ্ধতি নামক শব্দটি লিখুন .initবা .initializeযা আপনার নির্মাতা সাধারণত যা করতে পারে তা করে।

public class Thing {
    public Thing () {}
    public void initialize (a, b, c, d) {
        this.x = a; /*...*/
    }
}

সুতরাং এখন পরিবর্তে ঠিক মত যেতে:

Thing thing = new Thing(1, 2, 3, 4);

আপনি যেতে পারেন:

Thing thing = new Thing();

thing.doSomething();
thing.bind_events(evt_1, evt_2);
thing.initialize(1, 2, 3, 4);

সেখানে সুবিধাটি হ'ল আপনি এখন আপনার সিস্টেমে নির্ভরতা-ইনজেকশন / ইনভার্শন-অফ-নিয়ন্ত্রণ আরও সহজে ব্যবহার করতে পারেন easily

কথার পরিবর্তে

public class Soldier {
    private Weapon weapon;

    public Soldier (name, x, y) {
        this.weapon = new Weapon();
    }
}

আপনি সৈনিক নির্মাণ করতে পারেন, তাকে একটি সরঞ্জাম সম্পর্কিত পদ্ধতি, যেখানে আপনি দিতে হাতে তাকে একটি অস্ত্র, এবং তারপর কন্সট্রাকটর ফাংশন বাকি সব কল।

সুতরাং এখন, শত্রুদের সাবক্লাসিংয়ের পরিবর্তে যেখানে একজন সৈনিকের কাছে একটি পিস্তল রয়েছে এবং অন্য একজনের কাছে একটি রাইফেল রয়েছে এবং অন্যটির কাছে একটি শটগান রয়েছে, এবং এটিই কেবল পার্থক্য, আপনি কেবল বলতে পারেন:

Soldier soldier1 = new Soldier(),
        soldier2 = new Soldier(),
        soldier3 = new Soldier();

soldier1.equip(new Pistol());
soldier2.equip(new Rifle());
soldier3.equip(new Shotgun());

soldier1.initialize("Bob",  32,  48);
soldier2.initialize("Doug", 57, 200);
soldier3.initialize("Mike", 92,  30);

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

সম্পাদনা


ক্রিওটন যেমন উল্লেখ করেছেন, নীচে, এটি মূল পোস্টের "কীভাবে" জবাব দেয় , কিন্তু সত্যই "কেন" এর একটি ভাল কাজ করে না।

আপনি সম্ভবত উপরের উত্তরে দেখতে পাচ্ছেন, এর মধ্যে অনেক পার্থক্য নাও থাকতে পারে:

var myObj = new Object();
myObj.setPrecondition(1);
myObj.setOtherPrecondition(2);
myObj.init();

এবং লেখার

var myObj = new Object(1,2);

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

বস্তুর -চ্ছিক-কনফিগারেশন এটিকে প্রাকৃতিক বর্ধন; objectচ্ছিকভাবে ইন্টারফেসে মান সেট করা, অবজেক্টটি রান করার আগে।
জেএসের এই ধারণার জন্য কিছু দুর্দান্ত শর্টকাট রয়েছে, যা দৃ stronger়-টাইপযুক্ত সি-জাতীয় ভাষায় কেবল স্থানের বাইরে বলে মনে হয়।

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

আরও প্রাসঙ্গিক কারণ এবং যেটি বহুলভাবে প্রযোজ্য তা হ'ল কোনও সামগ্রীর সূচনাটি বর্তমানে অ্যাসিনক্রোনাস ডেটার উপর নির্ভর করে যা আপনার কাছে নেই।

আপনি জানেন যে আপনার অবজেক্টটির প্রয়োজন, সুতরাং আপনি এটি যে কোনও উপায়ে তৈরি করতে যাচ্ছেন তবে এটি সঠিকভাবে কাজ করার জন্য এটির সার্ভার থেকে বা অন্য ফাইল থেকে এখন এটি লোড হওয়া দরকার data

আবার, আপনি প্রয়োজনীয় উপাত্ত একটি বৃহত্তর উদ্যোগে পাস করছেন, বা একটি ইন্টারফেস তৈরি করা ধারণাটির পক্ষে আসলেই গুরুত্বপূর্ণ নয়, যতটা গুরুত্বপূর্ণ এটি আপনার অবজেক্টের ইন্টারফেস এবং আপনার সিস্টেমের ডিজাইনের পক্ষে গুরুত্বপূর্ণ ...

তবে অবজেক্টটি তৈরির ক্ষেত্রে আপনি এমন কিছু করতে পারেন:

var obj_w_async_dependencies = new Object();
async_loader.load(obj_w_async_dependencies.async_data, obj_w_async_dependencies);

async_loader ফাইলের নাম, বা কোনও সংস্থার নাম বা যা-ই হোক না কেন, সেই উত্সটি লোড করুন - সম্ভবত এটি শব্দ ফাইলগুলি, বা চিত্রের ডেটা লোড করে, বা এটি সংরক্ষণ করা অক্ষরের পরিসংখ্যানগুলি লোড করে ...

... এবং তারপরে এটি সেই ডেটা ফিরবে obj_w_async_dependencies.init(result);

এই ধরণের ডায়নামিক প্রায়শই ওয়েব-অ্যাপ্লিকেশনগুলিতে পাওয়া যায়।
অগত্যা কোনও উচ্চ স্তরের অ্যাপ্লিকেশনগুলির জন্য নির্মাণে নয়: উদাহরণস্বরূপ, গ্যালারীগুলি এখনই লোড এবং প্রারম্ভিক হতে পারে এবং ফটোগুলি সেগুলি প্রবাহিত করার সাথে সাথে প্রদর্শন করতে পারে - এটি আসলে একটি অ্যাসিঙ্ক-ইনিশিয়ালাইজেশন নয়, তবে যেখানে এটি আরও ঘন ঘন দেখা যায় তা হবে জাভাস্ক্রিপ্ট লাইব্রেরিতে।

একটি মডিউল অন্যটির উপর নির্ভর করতে পারে, এবং নির্ভর করে লোডিং সম্পূর্ণ না হওয়া পর্যন্ত সেই মডিউলটির সূচনা স্থগিত করা যেতে পারে।

এর গেম-নির্দিষ্ট দৃষ্টান্তগুলির ক্ষেত্রে, একটি আসল Gameশ্রেণি বিবেচনা করুন ।

কেন আমরা কল করতে পারি না .startবা .runকনস্ট্রাক্টরে?
রিসোর্সগুলি লোড করা দরকার - বাকি সমস্ত কিছু সংজ্ঞায়িত করা হয়েছে এবং যাওয়া ভাল, তবে আমরা যদি ডেটাবেস-সংযোগ ছাড়াই, বা টেক্সচার, মডেল বা শব্দ বা স্তর ছাড়াই গেমটি চালানোর চেষ্টা করি, তবে এটি হবে না একটি বিশেষ আকর্ষণীয় খেলা ...

... সুতরাং, তবে আমরা একটি সাধারণের সাথে Gameযা দেখি তার মধ্যে পার্থক্য , কেবলমাত্র আমরা এর "এগিয়ে চলুন" পদ্ধতিটিকে এমন একটি নাম দিই যা .init(বা বিপরীতভাবে, পৃথক লোডিংয়ের জন্য আরম্ভকে আরও আলাদা করে ভেঙে দেওয়া, লোড করা জিনিসগুলি সেট আপ করা এবং যখন সবকিছু সেট আপ হয়ে যায় তখন প্রোগ্রামটি চালানো)।


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

6
এটি বলা ঠিক ঠিক নয় যে আপনার কাছে বিভিন্ন অস্ত্র ধরণের ইনজেকশন সক্ষম করার জন্য এই পৃথক পদ্ধতির প্রয়োজন, বা সাবক্লাসের বিস্তার এড়াতে এই একমাত্র উপায়। আপনি কনস্ট্রাক্টরের মাধ্যমে অস্ত্রের উদাহরণগুলি পাস করতে পারেন! সুতরাং এটি আমার কাছ থেকে এটি -1 কারণ এটি কোনও বাধ্যতামূলক ব্যবহারের মামলা নয়।
কাইলোটান

1
-1 আমার কাছ থেকেও, কাইলোটনের মতো একই কারণে। আপনি খুব জোরালো যুক্তি দিচ্ছেন না, এটি সব কনস্ট্রাক্টর দিয়েই করা যেত।
পল মানতা

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

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

17

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

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

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


আপনাকে ধন্যবাদ, তবে আমি মূলত উদাহরণগুলির সন্ধান করছি, কারণ নিবন্ধটি তাদের কাছে নেই। আমার প্রশ্নটি সম্পর্কে অস্পষ্ট থাকলে আমি ক্ষমা চাইছি, তবে আমি এখন এটি সম্পাদনা করেছি।
ফ্রিসো

3

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

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

আরকিউ: ইনস () যদি সবকিছু পুনরায় সেট করে তবে আপনার পোল করা জিনিসগুলির জন্য আপনার একটি ক্লিনআপ পদ্ধতি থাকা দরকার নেই।

সম্পাদনা করুন: এই পোস্টের জবাব দেওয়া আমাকে জাভাস্ক্রিপ্টে পুলিং সম্পর্কে তৈরি করা একটি ছোট্ট নিবন্ধ চূড়ান্ত করতে উদ্বুদ্ধ করেছিল
আপনি যদি আগ্রহী হন তবে আপনি এটি এখানে পেতে পারেন:
http://gamealchemist.wordpress.com/


1
-1: কেবলমাত্র অবজেক্টের পুল থাকতে আপনার এটি করার দরকার নেই। আপনি কেবল স্পেসিস্ট ডেস্ট্রাক্টর কল দ্বারা স্থাননির্দেশের নতুন এবং ডিওলোকেশনের মাধ্যমে নির্মাণ থেকে বরাদ্দকে আলাদা করে এটি করতে পারেন। সুতরাং এটি কোনও আরম্ভকারী পদ্ধতি থেকে কনস্ট্রাক্টর / ডেস্ট্রাক্টরদের আলাদা করার বৈধ কারণ নয়।
নিকল বোলাস

প্লেসমেন্ট নতুন সি ++ নির্দিষ্ট এবং পাশাপাশি কিছুটা রহস্যজনক।
কাইলোটান

+1 এটি অন্যভাবে সি + তে করা সম্ভব হতে পারে। তবে অন্য ভাষাগুলিতে নয় ... এবং এটি সম্ভবত কারণ হ'ল আমি গেমোবজেক্টগুলিতে আরম্ভ পদ্ধতিটি ব্যবহার করব।
কিকাইমারু

1
@ নিকোল বোলাস: আমি মনে করি আপনি অত্যধিক আচরণ করছেন। পুলিংয়ের অন্যান্য উপায় রয়েছে (আপনি একটি জটিল বিষয় উল্লেখ করেছেন, সি ++ এর সাথে নির্দিষ্ট) এ বিষয়টি অস্বীকার করে না যে একটি পৃথক উদ্যোগ ব্যবহার করা অনেক ভাষায় পুলিং বাস্তবায়নের একটি দুর্দান্ত এবং সহজ উপায়। আমার পছন্দগুলি গেমডেভে আরও জেনেরিক উত্তরগুলিতে যায়।
গেমএলচেমিস্ট

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

0

আপনার প্রশ্নটি বিপরীত ... speakingতিহাসিকভাবে বলতে গেলে, আরও প্রাসঙ্গিক প্রশ্নটি হ'ল:

কেন হয় নির্মাণ + + intialisation মিশিয়ে ফেলেছিলেন , অর্থাত্ কেন না আমরা এই পদক্ষেপগুলি আলাদাভাবে না? নিশ্চয় এই পরিপন্থী SoC ?

সি ++ এর জন্য, আরআইআই এর উদ্দেশ্য হ'ল সম্পদ অধিগ্রহণ এবং রিলিজ সরাসরি জীবদ্দশায় আবদ্ধ করা হবে, এই আশায় যে এটি সম্পদ মুক্তির আশ্বাস দেবে। এটা কি পারে? আংশিক। এটি স্ট্যাক-ভিত্তিক / স্বয়ংক্রিয় ভেরিয়েবলের প্রসঙ্গে 100% পরিপূর্ণ, যেখানে সম্পর্কিত স্কোপটি স্বয়ংক্রিয়ভাবে ডেস্ট্রাক্টরদের কল করে / এই ভেরিয়েবলগুলি প্রকাশ করে (অতএব যোগ্যতা অর্জনকারী automatic)। তবে হিপ ভেরিয়েবলের জন্য, অত্যন্ত কার্যকর এই প্যাটার্নটি দুঃখজনকভাবে ভেঙে গেছে, যেহেতু আপনি এখনও ডাস্ট্রেক্টর deleteচালানোর জন্য স্পষ্টভাবে কল করতে বাধ্য হয়েছেন , এবং যদি আপনি এটি করতে ভুলে যান তবে আরআইআই কী সমাধান করার চেষ্টা করে তা দ্বারা আপনাকে কামড় দেওয়া হবে; হিপ-বরাদ্দ ভেরিয়েবলের প্রসঙ্গে, তখন, সি ++ সি এর তুলনায় সীমিত সুবিধা দেয় ( deleteবনাম)free()) আরম্ভের সাথে নির্মাণকে বিবাদ দেওয়ার সময়, যা নিম্নলিখিতগুলির ক্ষেত্রে নেতিবাচকভাবে প্রভাবিত করে:

গিতে গেমস / সিমুলেশনগুলির জন্য একটি অবজেক্ট সিস্টেম তৈরির দৃ strongly়ভাবে সুপারিশ করা হয় যে এটি সিআইএস + এবং পরবর্তী ধ্রুপদী ওও ভাষাগুলি যে অনুমানগুলি করেছে তার গভীরতর বোঝার মাধ্যমে RAII এবং অন্যান্য যেমন ওও-কেন্দ্রিক ধরণের সীমাবদ্ধতার উপর প্রচুর পরিমাণে আলোকপাত করবে in (মনে রাখবেন যে সি ++ সি-এ নির্মিত একটি ওও সিস্টেম হিসাবে শুরু হয়েছিল)।

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