স্থির উপাত্তের সদস্যদের শ্রেণির বাইরে আলাদাভাবে সি ++ (জাভা থেকে আলাদা) হিসাবে সংজ্ঞায়িত করতে হবে কেন?


41
class A {
  static int foo () {} // ok
  static int x; // <--- needed to be defined separately in .cpp file
};

A::x.Cpp ফাইলে (বা টেমপ্লেটগুলির জন্য একই ফাইল) আলাদা করে সংজ্ঞায়িত করার প্রয়োজন দেখছি না । কেন A::xএকই সাথে ঘোষিত ও সংজ্ঞায়িত করা যায় না?

এটি কি historicalতিহাসিক কারণে নিষিদ্ধ করা হয়েছে?

আমার মূল প্রশ্নটি হ'ল যদি staticডেটা সদস্যদের একই সাথে ( জাভা হিসাবে ) ঘোষিত / সংজ্ঞায়িত করা হয় তবে এটি কোনও কার্যকারিতা প্রভাবিত করবে ?


সেরা অনুশীলন হিসাবে, সূচনা আদেশের সমস্যা এড়াতে সাধারণত আপনার স্ট্যাটিক ভেরিয়েবলটিকে স্থির পদ্ধতিতে (সম্ভবত স্থানীয় স্ট্যাটিক হিসাবে) মোড়ানো ভাল better
ট্যামস সেজেলি

2
এই নিয়মটি সি ++ 11 এ আসলে কিছুটা শিথিল। কনস্ট্যাট স্থির সদস্যদের সাধারণত আর সংজ্ঞায়িত করতে হয় না। দেখুন: en.wikipedia.org/wiki/...
ঝাপসা

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

1
স্ট্যাক ওভারফ্লোতে অন্তর্ভুক্ত?
মনিকা

2
সি ++ 17 স্ট্যাটিক ডাটা সদস্যদের (এমনকি অ পূর্ণসংখ্যা ধরনের জন্য) এর ইনলাইন আরম্ভের অনুমতি দেয়: inline static int x[] = {1, 2, 3};। En.cppreferences.com/w/cpp/language/static# স্ট্যাটিক_ডাটা_ মেম্বারস দেখুন
ভ্লাদিমির

উত্তর:


15

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

সি ++ সংকলন মডেলটি সি এর থেকে উদ্ভূত হয়, যেখানে আপনি (শিরোলেখ) ফাইলগুলি অন্তর্ভুক্ত করে উত্স ফাইলে ঘোষণাগুলি আমদানি করেন। এইভাবে, সংকলক হ'ল একটি বড় উত্স ফাইল দেখেছে, এতে অন্তর্ভুক্ত সমস্ত ফাইল রয়েছে এবং সেই ফাইলগুলি থেকে অন্তর্ভুক্ত সমস্ত ফাইল পুনরাবৃত্তভাবে। এর আইএমওর একটি বড় সুবিধা রয়েছে, যা এটি সংকলকটি কার্যকর করা সহজ করে তোলে। অবশ্যই, আপনি অন্তর্ভুক্ত ফাইলগুলিতে যে কোনও কিছু লিখতে পারেন, যেমন ঘোষণা এবং সংজ্ঞা উভয়ই। .C বা .cpp ফাইলগুলিতে শিরোনাম ফাইল এবং সংজ্ঞা সংজ্ঞায়িত করা কেবল একটি ভাল অনুশীলন।

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

উদাহরণস্বরূপ, জিএনইউ পাসকালে আপনি aকোনও ফাইলটিতে একটি ইউনিট লিখতে পারেন a.pas:

unit a;

interface

var MyStaticVariable: Integer;

implementation

begin
  MyStaticVariable := 0
end.

যেখানে একই উত্স ফাইলে বিশ্বব্যাপী ভেরিয়েবল ঘোষিত হয় এবং প্রারম্ভিক হয়।

তারপরে আপনার বিভিন্ন ইউনিট থাকতে পারে যা একটি আমদানি করে এবং বিশ্বব্যাপী ভেরিয়েবল ব্যবহার করে MyStaticVariable, যেমন ইউনিট বি ( b.pas):

unit b;

interface

uses a;

procedure PrintB;

implementation

procedure PrintB;
begin
  Inc(MyStaticVariable);
  WriteLn(MyStaticVariable)
end;
end.

এবং একটি ইউনিট গ ( c.pas):

unit c;

interface

uses a;

procedure PrintC;

implementation

procedure PrintC;
begin
  Inc(MyStaticVariable);
  WriteLn(MyStaticVariable)
end;
end.

অবশেষে আপনি একটি প্রধান প্রোগ্রামে ইউনিট বি এবং সি ব্যবহার করতে পারেন m.pas:

program M;

uses b, c;

begin
  PrintB;
  PrintC;
  PrintB
end.

আপনি এই ফাইলগুলি আলাদাভাবে সংকলন করতে পারেন:

$ gpc -c a.pas
$ gpc -c b.pas
$ gpc -c c.pas
$ gpc -c m.pas

এবং তারপরে একটি নির্বাহযোগ্য উত্পাদন করুন:

$ gpc -o m m.o a.o b.o c.o

এবং এটি চালান:

$ ./m
1
2
3

এখানে কৌশলটি হ'ল সংকলক যখন কোনও প্রোগ্রাম মডিউলে কোনও ব্যবহারের নির্দেশ দেখেন (যেমন, বি.পিএস-এ একটি ব্যবহার করে), এটি সংশ্লিষ্ট। পাস্স ফাইলটি অন্তর্ভুক্ত করে না, তবে একটি .gpi ফাইল সন্ধান করে, যেমন একটি প্রাক-সংকলিত জন্য ইন্টারফেস ফাইল ( ডকুমেন্টেশন দেখুন )। এই .gpiফাইলগুলি .oপ্রতিটি মডিউল সংকলিত হওয়ার সাথে সাথে ফাইলগুলি সংকলক দ্বারা উত্পাদিত হয় । সুতরাং গ্লোবাল সিম্বলটি MyStaticVariableকেবলমাত্র একবার বস্তু ফাইলে সংজ্ঞায়িত করা হয় a.o

জাভা একইভাবে কাজ করে: যখন সংকলক একটি ক্লাস এ ক্লাস বিতে আমদানি করে তখন এটি A এর জন্য শ্রেণি ফাইলটি দেখায় এবং ফাইলটির প্রয়োজন হয় না A.java। সুতরাং ক্লাস এ এর ​​সমস্ত সংজ্ঞা এবং সূচনা একটি উত্স ফাইলে রাখা যেতে পারে in

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


42

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

যদি আপনি তাদের শিরোনামে সংজ্ঞায়িত করার চেষ্টা করেন তবে সেগুলি প্রতিটি মডিউলে সংজ্ঞায়িত করা হবে যা এতে শিরোলেখ অন্তর্ভুক্ত করে এবং লিঙ্কিংয়ের সময় আপনি ত্রুটিগুলি পেয়ে যাবেন যেমন এটি সমস্ত সদৃশ সংজ্ঞা পেয়ে যায়।

হ্যাঁ, এটি কমপক্ষে আংশিক একটি সিফ্রন্ট থেকে ডেটিং historicalতিহাসিক সমস্যা; একটি সংকলক এমন লিখিত হতে পারে যা "স্ট্যাটিক_মেমার_স_অভিরিথিং সি পি পি" এবং এর সাথে লিঙ্কযুক্ত একটি ধরণের তৈরি করবে। তবে এটি পিছনে সামঞ্জস্যতা ভেঙে দেবে এবং এর ফলে কোনও আসল উপকার হবে না।


2
আমার প্রশ্নটি বর্তমান আচরণের কারণ নয়, বরং এই জাতীয় ভাষার ব্যাকরণের পক্ষে ন্যায়সঙ্গত। অন্য কথায়, ধরুন যদি staticভেরিয়েবলগুলি একই জায়গায় (জাভার মতো) হিসাবে ঘোষিত / সংজ্ঞায়িত করা হয় তবে কী ভুল হতে পারে?
iammilind

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

1
@ ক্লেম, staticসদস্যদের সম্পর্কে কী template? তাদের সমস্ত শিরোনাম ফাইলগুলিতে দৃশ্যমান হওয়ার প্রয়োজন হিসাবে এগুলি অনুমোদিত। আমি এই উত্তরটি বিতর্ক করছি না, তবে এটি আমার প্রশ্নের সাথেও মেলে না।
iammilind

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

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

6

এর সম্ভাব্য কারণ হ'ল এটি সি ++ ভাষা পরিবেশের ক্ষেত্রে প্রয়োগযোগ্য রাখে যেখানে অবজেক্ট ফাইল এবং লিংকেজ মডেল একাধিক অবজেক্ট ফাইল থেকে একাধিক সংজ্ঞা সংহতকরণকে সমর্থন করে না।

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

এই পরিস্থিতি সম্ভব, তবে অভিযোগকারীকে একাধিক সংজ্ঞা পরিচালনা করতে লিঙ্কারের প্রয়োজন।

(এবং দ্রষ্টব্য যে এটি একটি সংজ্ঞা রুলের সাথে সাংঘর্ষিক, যদি না এটি কোনও ধরণের চিহ্ন বা কোন ধরণের অংশে স্থাপন করা হয় তবে এটি করা যায় না))


6

সি ++ এবং জাভার মধ্যে দুর্দান্ত পার্থক্য রয়েছে।

জাভা তার নিজস্ব ভার্চুয়াল মেশিনে কাজ করে যা সবকিছুকে তার নিজের রান-টাইম পরিবেশে তৈরি করে। যদি কোনও সংজ্ঞা একাধিকবার দেখা হয়ে থাকে, রানটটাইম পরিবেশটি চূড়ান্তভাবে জানে একই অবজেক্টে কেবল কাজ করবে।

সি ++ তে কোনও "চূড়ান্ত জ্ঞানের মালিক" নেই: সি ++, সি, ফোর্টরান পাস্কাল ইত্যাদি সমস্ত সোর্স কোড (সিপিপি ফাইল) থেকে মধ্যবর্তী বিন্যাসে (ওবিজে ফাইল, বা ".o" ফাইল) এর উপর নির্ভর করে সমস্ত "অনুবাদক" ওএস) যেখানে বিবৃতিগুলি মেশিনের নির্দেশে অনুবাদ করা হয় এবং নামগুলি প্রতীক টেবিলের মধ্যস্থতায় অপ্রত্যক্ষ ঠিকানা হয়ে যায়।

একটি প্রোগ্রাম সংকলক দ্বারা তৈরি করা হয় নি, তবে অন্য একটি প্রোগ্রাম ("লিঙ্কার") দ্বারা তৈরি করা হয়েছে, যা সমস্ত ওবিজে-এসকে একত্রিত করে (তারা যে ভাষা থেকে আসে না কেন) চিহ্নগুলির দিকে সমস্ত ঠিকানাগুলি আবার নির্দেশ করে তাদের দিকে কার্যকর সংজ্ঞা।

লিঙ্কার যেভাবে কাজ করে, একটি সংজ্ঞা (যা একটি ভেরিয়েবলের জন্য শারীরিক স্থান তৈরি করে) অবশ্যই অনন্য হতে হবে।

নোট করুন যে সি ++ নিজে লিঙ্ক করে না, এবং লিঙ্কারটি সি ++ স্পেস দ্বারা জারি করা হয় না: লিঙ্কারটি ওএস মডিউলগুলি যেভাবে তৈরি করা হয় তার কারণে বিদ্যমান (সাধারণত সি এবং এএসএম)। সি ++ এটিকে সেভাবেই ব্যবহার করতে হবে।

এখন: একটি শিরোলেখ ফাইলটি বেশ কয়েকটি সিপিপি ফাইলগুলিতে "আটকানো"। প্রতিটি সিপিপি ফাইল আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা করে অনুবাদ করা হয়। বিভিন্ন সিপিপি ফাইল অনুবাদ করে একটি সংকলক, একই সংজ্ঞা প্রাপ্ত হয়ে সমস্ত ফলাফল OBJs এ সংজ্ঞায়িত অবজেক্টের জন্য " ক্রিয়েশন কোড " রাখে।

সংকলকটি জানে না (এবং কখনই জানতে পারবে না) যদি সেই সমস্ত ওবিজেগুলি কখনও একত্রে একক প্রোগ্রাম তৈরি করতে বা পৃথক পৃথক স্বতন্ত্র প্রোগ্রাম গঠনের জন্য ব্যবহার করা হয়।

সংযোগকারী কীভাবে এবং কেন সংজ্ঞা বিদ্যমান এবং কোথা থেকে আসে তা জানেন না (এটি সি ++ সম্পর্কেও জানে না: প্রতিটি "স্থির ভাষা" সংযুক্ত হওয়ার জন্য সংজ্ঞা এবং রেফারেন্স তৈরি করতে পারে)। এটি কেবলমাত্র একটি প্রদত্ত "প্রতীক" এর উল্লেখ রয়েছে যা প্রদত্ত ফলাফলের ঠিকানায় "সংজ্ঞায়িত" রয়েছে।

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

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


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

1
@ জিওর্জিও: জাভা সম্পর্কিত রেফারেন্সটি স্বাগত নাও হতে পারে, তবে আমি মনে করি যে এমিলিওর উত্তরটি বেশিরভাগ ক্ষেত্রেই ইস্যুটির সংক্ষেপে সঠিকভাবে পাওয়া যায়, অর্থাত্ পৃথক সংকলনের পরে অবজেক্ট ফাইল / লিংক ফেজ।
ixache

5

এটি প্রয়োজনীয় কারণ অন্যথায় সংকলকটি কোথায় ভেরিয়েবলটি রাখবে তা জানে না। প্রতিটি সিপিপি ফাইল স্বতন্ত্রভাবে সংকলিত হয় এবং অন্যটির সম্পর্কে জানে না। লিঙ্কারটি ভেরিয়েবল, ফাংশন ইত্যাদির সমাধান করে personally আমি ব্যক্তিগতভাবে দেখতে পাচ্ছি না যে ভিটিবেল এবং স্ট্যাটিক সদস্যদের মধ্যে পার্থক্য কী (ভিটিবেল কোন ফাইলটি সংজ্ঞায়িত হয়েছে তা আমাদের বেছে নিতে হবে না)।

আমি বেশিরভাগই ধরে নিয়েছি যে সংকলক লেখকদের পক্ষে এটি সেভাবে বাস্তবায়ন করা সহজ। শ্রেণি / কাঠামোর বাইরে স্ট্যাটিক ওয়ারগুলি বিদ্যমান এবং সম্ভবত হয় ধারাবাহিকতার কারণে বা কারণ সংমিতি লেখকরা তাদের মানগুলিতে এই সীমাবদ্ধতার সংজ্ঞা দিয়েছিলেন তাদের জন্য 'প্রয়োগ করা সহজ' হবে।


2

আমি মনে করি কারণ খুঁজে পেয়েছি। staticপৃথক স্পেসে ভেরিয়েবলের সংজ্ঞা দেওয়া যেকোন মান থেকে এটি আরম্ভ করতে দেয়। যদি আরম্ভ না করা হয় তবে এটি 0 এ ডিফল্ট হবে।

সি ++ 11 এর আগে সি ++ এ শ্রেণি শুরুর অনুমতি দেওয়া হয়নি। সুতরাং কেউ যেমন লিখতে পারে না :

struct X
{
  static int i = 4;
};

সুতরাং এখন চলক আরম্ভ করার জন্য এটি অবশ্যই শ্রেণীর বাইরে লিখতে হবে:

struct X
{
  static int i;
};
int X::i = 4;

অন্যান্য উত্তরেও যেমন আলোচনা হয়েছে, int X::iএখন অনেকগুলি ফাইলের মধ্যে একটি বৈশ্বিক এবং ঘোষিত বিশ্বব্যাপী একাধিক প্রতীক লিঙ্ক ত্রুটির কারণ হয়ে দাঁড়ায়।

এইভাবে staticএকটি পৃথক অনুবাদ ইউনিটের অভ্যন্তরে শ্রেণি পরিবর্তনশীল ঘোষণা করতে হয় । তবে, তবুও এটি যুক্তিযুক্ত হতে পারে যে নিম্নলিখিত পদ্ধতিতে একাধিক চিহ্ন তৈরি না করার জন্য সংকলককে নির্দেশ দেওয়া উচিত

static int X::i = 4;
^^^^^^

0

এ :: এক্স কেবলমাত্র একটি বৈশ্বিক পরিবর্তনশীল তবে এ এর ​​নাম এবং এটি অ্যাক্সেস বিধিনিষেধের সাথে রয়েছে।

অন্য যে কোনও বৈশ্বিক ভেরিয়েবলের মতো এখনও কাউকে এটিকে ঘোষণা করতে হবে এবং এটি এমন কোনও প্রকল্পেও করা যেতে পারে যা এটির বাকী এ কোড থাকা প্রকল্পের সাথে স্থিরভাবে সংযুক্ত রয়েছে।

আমি এই সমস্ত খারাপ নকশাকে কল করব, তবে কয়েকটি বৈশিষ্ট্য রয়েছে যা আপনি এইভাবে কাজে লাগাতে পারেন:

  1. কন্সট্রাক্টর কল অর্ডার ... কোনও পূর্বনির্মাণের জন্য গুরুত্বপূর্ণ নয়, তবে আরও জটিল সদস্যের জন্য যা সম্ভবত অন্যান্য স্ট্যাটিক বা গ্লোবাল ভেরিয়েবলগুলি অ্যাক্সেস করে, এটি সমালোচনাযোগ্য হতে পারে।

  2. স্ট্যাটিক ইনিশিয়ালাইজার - আপনি কোন ক্লায়েন্টকে সিদ্ধান্ত নিতে দিতে পারেন যে এ :: x এর সাথে আরম্ভ করা উচিত।

  3. সি ++ এবং সি-তে, কারণ পয়েন্টারগুলির মাধ্যমে আপনার মেমরির সম্পূর্ণ অ্যাক্সেস রয়েছে, ভেরিয়েবলগুলির শারীরিক অবস্থান উল্লেখযোগ্য। একটি লিঙ্ক অবজেক্টে ভেরিয়েবলটি কোথায় অবস্থিত তার উপর ভিত্তি করে আপনি খুব দুষ্টু জিনিস ব্যবহার করতে পারেন।

আমি সন্দেহ করি এগুলি "কেন" এই পরিস্থিতি তৈরি হয়েছে। এটি সম্ভবত সি ++ এ রূপান্তরিত করার একটি বিবর্তন, এবং পিছনে সামঞ্জস্যতার সমস্যা যা আপনাকে এখন ভাষা পরিবর্তন করতে বাধা দেয়।


2
এই অফারটি কোন কিছুরই সৃষ্টি পয়েন্ট উপর সারগর্ভ বলে মনে হচ্ছে না এবং পূর্বে 6 উত্তর ব্যাখ্যা
মশা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.