সি ++ যেখানে স্ট্যাটিক কনস্টের সূচনা করতে হবে


129

আমার একটা ক্লাস আছে

class foo {
public:
   foo();
   foo( int );
private:
   static const string s;
};

sসোর্স ফাইলে স্ট্রিংটি শুরু করার সেরা জায়গাটি কোথায় ?

উত্তর:


178

যে কোনও জায়গায় একটি সংকলনের ইউনিটে (সাধারণত একটি .cpp ফাইল) করতে হবে:

foo.h

class foo {
    static const string s; // Can never be initialized here.
    static const char* cs; // Same with C strings.

    static const int i = 3; // Integral types can be initialized here (*)...
    static const int j; //     ... OR in cpp.
};

foo.cpp

#include "foo.h"
const string foo::s = "foo string";
const char* foo::cs = "foo C string";
// No definition for i. (*)
const int foo::j = 4;

(*) মান অনুযায়ী আপনার অবশ্যই iশ্রেণীর সংজ্ঞা (যেমন jরয়েছে) এর বাইরে সংজ্ঞা দিতে হবে যদি এটি কেবল অবিচ্ছেদ্য ধ্রুবক এক্সপ্রেশন ছাড়া অন্য কোডে ব্যবহৃত হয়। বিস্তারিত জানার জন্য নীচে ডেভিডের মন্তব্য দেখুন।


27
আমি উন্নত করেছি, তবে মানটি পর্যালোচনা করার পরে আপনার কোডে একটি ত্রুটি রয়েছে: iঅবশ্যই সিপিপিতে সংজ্ঞায়িত করা উচিত । §৯.৪.২ / ৪ যদি কোনও স্ট্যাটিক ডেটা সদস্য
ডেভিড রদ্রিগেজ - ড্রিবিস

3
মানদণ্ডগুলি থেকে আপনার উক্তির ভিত্তিতে, এটি কেবলi সংজ্ঞায়িত হতে হবে যদি এটি অবিচ্ছেদ্য ধ্রুবক প্রকাশের চেয়ে অন্য কোথাও ব্যবহৃত হয়, তাই না? এক্ষেত্রে আপনি বলতে পারবেন না যে এখানে একটি ত্রুটি রয়েছে কারণ নিশ্চিত হওয়ার মতো যথেষ্ট প্রসঙ্গ নেই - বা অন্য কোনও কোড না থাকলে উপরের উদাহরণটি কঠোরভাবে বলতে গেলে সঠিক। এখন আমি আপনার মন্তব্যের (+1) প্রশংসা করি, আমি এখনও জিনিস নিজেই শিখছি! সুতরাং আমি চেষ্টা করব এবং উত্তরে সেই পয়েন্টটি পরিষ্কার করব, দয়া করে এটি আরও ভাল কিনা আমাকে
জানাবেন

@ স্পেকার্ট দুঃখিত, আমি যদি বোবা শব্দ করি তবে অবিচ্ছেদ্য ধ্রুবক প্রকাশ ছাড়া অন্য বিবৃতিটির উদাহরণ হতে পারে?
দক্ষম

3
উদাহরণস্বরূপ @Saksham একটি ফাংশন, যেমন কলিং: int f() { return 42; } class foo { static const int i = f(); /* Error! */ }লক্ষ্য করুন সি ++ 11 পারবেন কলিং 'constexpr' ফাংশন:constexpr int f() { return 42; } class foo { static const int i = f(); /* Ok */ }
squelart

@ স্পিকার্ট আমি পাঠ্যটি এমনভাবে পড়েছি যে সদস্যটি যদি মোটেও ব্যবহৃত হয় তবে সংজ্ঞাটি সরবরাহ করতে হবে - স্ট্যান্ডার্ডে শব্দটি এই প্রয়োজনীয়তাকে অবিচ্ছেদ্য ধ্রুবক প্রকাশের মধ্যে সীমাবদ্ধ করে না।
ভ্লাদলসেভ

12

স্ট্যাটিক সদস্যদের ফাইল স্কোপ বা .cpp অনুবাদ ইউনিটে বা যথাযথ নেমস্পেসে শুরু করতে হবে:

const string foo::s( "my foo");

11

একই শীর্ষস্থানটির মধ্যে একটি অনুবাদ ইউনিটে, সাধারণত শীর্ষে:

// foo.h
struct foo
{
    static const std::string s;
};

// foo.cpp
const std::string foo::s = "thingadongdong"; // this is where it lives

// bar.h
namespace baz
{
    struct bar
    {
        static const float f;
    };
}

// bar.cpp
namespace baz
{
    const float bar::f = 3.1415926535;
}

8

সি ++ 17 যেহেতু ইনলাইন স্পেসিফায়ারটি ভেরিয়েবলগুলিতেও প্রযোজ্য। আপনি এখন শ্রেণীর সংজ্ঞায় স্থির সদস্যের পরিবর্তনশীল সংজ্ঞায়িত করতে পারেন:

#include <string>

class foo {
public:
   foo();
   foo( int );
private:
   inline static const std::string s { "foo" };
};

1

কেবলমাত্র অবিচ্ছেদ্য মানগুলি (উদাহরণস্বরূপ static const int ARRAYSIZE) শিরোনাম ফাইলটিতে সূচনা করা হয় কারণ এগুলি অ্যারের আকারের মতো কোনও কিছু সংজ্ঞায়িত করতে ক্লাস শিরোনামে সাধারণত ব্যবহৃত হয়। অ-অবিচ্ছেদ্য মানগুলি বাস্তবায়ন ফাইলে সূচনা করা হয়।

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