আমার এটি আছে struct:
struct Snapshot
{
double x;
int y;
};
আমি চাই xএবং চাই y0। তারা ডিফল্ট হিসাবে 0 হবে বা আমার কি করতে হবে:
Snapshot s = {0,0};
কাঠামো শূন্য করার অন্যান্য উপায়গুলি কী কী?
আমার এটি আছে struct:
struct Snapshot
{
double x;
int y;
};
আমি চাই xএবং চাই y0। তারা ডিফল্ট হিসাবে 0 হবে বা আমার কি করতে হবে:
Snapshot s = {0,0};
কাঠামো শূন্য করার অন্যান্য উপায়গুলি কী কী?
উত্তর:
আপনি স্ট্রাক্টটি আরম্ভ না করলে এগুলি নাল নয়।
Snapshot s; // receives no initialization
Snapshot s = {}; // value initializes all members
দ্বিতীয়টি সমস্ত সদস্যকে শূন্য করে দেবে, প্রথমটি তাদের অনির্ধারিত মানগুলিতে ফেলে দেয়। নোট করুন যে এটি পুনরাবৃত্ত হয়:
struct Parent { Snapshot s; };
Parent p; // receives no initialization
Parent p = {}; // value initializes all members
দ্বিতীয়টি p.s.{x,y}শূন্য করবে । আপনি যদি আপনার স্ট্রাক্টে কনস্ট্রাক্টর পেয়ে থাকেন তবে আপনি এই সামগ্রিক আরম্ভকারী তালিকাটি ব্যবহার করতে পারবেন না। যদি এটি হয় তবে আপনাকে সেই নির্মাতাদের যথাযথ সূচনা যোগ করতে হবে
struct Snapshot {
int x;
double y;
Snapshot():x(0),y(0) { }
// other ctors / functions...
};
X এবং y উভয়কেই আরম্ভ করবে ০. দ্রষ্টব্য যে আপনি x(), y()তাদের প্রকারের বিষয়টিকে উপেক্ষা করে আরম্ভ করার জন্য ব্যবহার করতে পারেন : এরপরে এটির আরম্ভকরণের মান হয় এবং সাধারণত একটি প্রাথমিক প্রাথমিক মান পাওয়া যায় (ডাবল জন্য ০.০, ডাবল জন্য ০.০, ব্যবহারকারীকে সংজ্ঞায়িত করার জন্য ডিফল্ট কনস্ট্রাক্টর বলা হয়) প্রকারভেদে ব্যবহারকারী ঘোষিত কনস্ট্রাক্টর রয়েছে ...)। এটি গুরুত্বপূর্ণ যদি আপনার স্ট্রাক্ট একটি টেম্পলেট হয় especially
Snapshot s = {};পিওডি সদস্যবিহীন সদস্যদের জন্য কাজ করবেন (তাদের শূন্য করার জন্য)?
না, তারা ডিফল্টরূপে 0 নয়। সমস্ত মান বা 0 এ ডিফল্ট হওয়া নিশ্চিত করার সহজ উপায়টি হল একজন কনস্ট্রাক্টরকে সংজ্ঞায়িত করা
Snapshot() : x(0), y(0) {
}
এটি নিশ্চিত করে যে স্ন্যাপশটের সমস্ত ব্যবহারের প্রাথমিক মানের মান থাকবে।
সাধারণভাবে, না। তবে কোনও ফাংশনে ফাইল-স্কোপ বা স্থিতিশীল হিসাবে ঘোষিত একটি স্ট্রাক্ট / উইল / এ 0 টি শুরু হবে (ঠিক সেই সমস্ত স্কোপের অন্যান্য ভেরিয়েবলের মতো):
int x; // 0
int y = 42; // 42
struct { int a, b; } foo; // 0, 0
void foo() {
struct { int a, b; } bar; // undefined
static struct { int c, d; } quux; // 0, 0
}
পিওডের সাহায্যে আপনিও লিখতে পারেন
Snapshot s = {};
আপনার সি ++ তে মেমসেট ব্যবহার করা উচিত নয়, মেমসেটের একটি অপূর্ণতা রয়েছে যে স্ট্রাক্টে যদি কোনও নন-পড থাকে তবে এটি এটি নষ্ট করে দেবে।
বা এই মত:
struct init
{
template <typename T>
operator T * ()
{
return new T();
}
};
Snapshot* s = init();
SomeType foo();এটি সাধারণত একটি, যদিও এটি অন্যদের সাথে ঘটতে পারে - ফাংশন সংজ্ঞাতে (সেই ক্ষেত্রে, একটি ফাংশন fooযা ফিরে আসে SomeType)। নেক্রোর জন্য দুঃখিত, তবে অন্য কেউ যদি এইজন্য হোঁচট খায় তবে আমি উত্তর দেব।
সি ++ এ নো-আর্গুমেন্ট কনস্ট্রাক্টর ব্যবহার করুন। সি তে আপনার কাছে কনস্ট্রাক্টর থাকতে পারে না, তাই হয় memsetবা - আকর্ষণীয় সমাধান - মনোনীত প্রারম্ভিক ব্যবহার করুন:
struct Snapshot s = { .x = 0.0, .y = 0.0 };
যেহেতু এটি একটি পিওডি (মূলত একটি সি স্ট্রাক্ট) তাই এটি সি পদ্ধতিতে আরম্ভ করার ক্ষেত্রে খুব কম ক্ষতি হয়:
Snapshot s;
memset(&s, 0, sizeof (s));
বা একইভাবে
Snapshot *sp = new Snapshot;
memset(sp, 0, sizeof (*sp));
যদিও আমি এখনও calloc()সি ++ প্রোগ্রামে ব্যবহার করতে পারি না।
পড সদস্যদের আপনার প্রাথমিকের তালিকাটি সংক্ষিপ্ত করতে বেস শ্রেণিতে স্থানান্তর করুন:
struct foo_pod
{
int x;
int y;
int z;
};
struct foo : foo_pod
{
std::string name;
foo(std::string name)
: foo_pod()
, name(name)
{
}
};
int main()
{
foo f("bar");
printf("%d %d %d %s\n", f.x, f.y, f.z, f.name.c_str());
}