সি ++ এ হেডার-ফাইলে ঘোষণার সাথে উত্স-ফাইলে স্থির পদ্ধতিটি নির্ধারণ করুন


142

সি ++ এ স্থিতিশীল পদ্ধতি নিয়ে কাজ করতে আমার একটু সমস্যা হচ্ছে

উদাহরণ .h:

class IC_Utility {
public:
    IC_Utility();
    ~IC_Utility();

    std::string CP_PStringToString( const unsigned char *outString );
    void CP_StringToPString( std::string& inString, unsigned char *outString, short inMaxLength );
    static void CP_StringToPString( std::string& inString, unsigned char *outString);
    void CP_StringToPString( FxString& inString, FxUChar *outString);

};

উদাহরণ .cpp:

static void IC_Utility::CP_StringToPString(std::string& inString, unsigned char *outString)
{
    short       length = inString.length();

   if( outString != NULL )
    {
        if( length >= 1 )
            CPLAT::CP_Utility::CP_CopyMemory( inString.c_str(), &outString[ 1 ], length );

            outString[ 0 ] = length;
    }
}

আমি যেমন একটি কল করতে চেয়েছিলেন:

IC_Utility::CP_StringToPString(directoryNameString, directoryName );

তবে আমি একটি ত্রুটি পেয়েছি:

error: cannot declare member function 'static void IC_Utility::CP_StringToPString(std::string&, unsigned char*)' to have static linkage

আমি কেন এটি করতে পারি না তা বুঝতে পারি না। আমি কী চাই এবং কীভাবে কীভাবে অর্জন করতে পারি তা বুঝতে কেউ আমাকে বুঝতে সহায়তা করতে পারে?


2
প্রথমত, আপনার static.cpp ফাইলে কীওয়ার্ডটি অপসারণ করা উচিত । সি ++ এর অনুমতি দেয় না।
ফেজেভেজ

10
@ ফেজেভেজ: পর্যায়ক্রমে, এটি দিয়ে প্রতিস্থাপন করুন /* static */। আমি .h এবং .cpp ফাইলগুলিতে একই সংশোধক এবং ডিফল্ট আর্গুমেন্ট থাকা পছন্দ করি।
ডেভিড থর্নলি

2
টি এল; ডিআর: Keep এর staticহেডার ফাইলে .hকরে তা ", বর্গ সংযুক্ত কোন বস্তুর না" অর্থ, অপসারণ staticমধ্যে .cppফাইল, এটি একটি ভিন্ন অর্থ যা আপনি এখানে চাই না হয়েছে।
স্টাফেন গৌরিচন

উত্তর:


228

অপসারণ staticপদ্ধতির সংজ্ঞাতে কীওয়ার্ডটি । এটি কেবল আপনার শ্রেণির সংজ্ঞায় রাখুন।

static.cpp ফাইলে রাখা কীওয়ার্ডটির অর্থ একটি নির্দিষ্ট ফাংশনটির একটি স্ট্যাটিক লিঙ্কেজ থাকে, অর্থাৎ। এটি কেবল একই ফাইলের অন্যান্য ফাংশন থেকে অ্যাক্সেসযোগ্য।


1
আহ, staticপদ্ধতিটি সংজ্ঞায় এটি পেয়েছেন অর্থ এই শ্রেণীর কেবলমাত্র অন্যান্য পদ্ধতিই সেই স্থির পদ্ধতি অ্যাক্সেস করতে পারে, সেই শ্রেণীর বাইরে অন্য কোনও পদ্ধতি নেই।
এবিভি

14
অন্যান্য শ্রেণি পদ্ধতি নয়, .cpp ফাইলে অন্যান্য ফাংশন। আপনার যাইহোক সি ++ এ করা উচিত নয়। আপনি যদি অভ্যন্তরীণ লিঙ্কেজ রাখতে কোনও সি ++ ফাংশন চান তবে আপনার এটি কোনও বেনামে নেমস্পেসে স্থাপন বিবেচনা করা উচিত। static
.Cpp

1
কেবল কৌতূহলের জন্য ... আমি যদি ক্লাসে কোনও স্ট্যাটিক শ্রেণীর সদস্যকে সংজ্ঞায়িত করি (.h ফাইলে) তবে আমি কীভাবে স্থির লিঙ্কেজ ব্যবহার করতে পারি?
লম্ব্রিক

আপনি পারবেন না। এবং এটি করার কোনও মানে হয় না, যেহেতু প্রোগ্রামটিকে একসাথে যুক্ত করার ফলে অমীমাংসিত বহিরাগত উপস্থিত হতে পারে।
x13n

41

কীওয়ার্ডগুলি staticএবং virtualসংজ্ঞাটিতে পুনরাবৃত্তি করা উচিত নয়। সেগুলি কেবল শ্রেণির ঘোষণায় ব্যবহার করা উচিত।


11

আপনার staticফাংশন সংজ্ঞা থাকতে হবে না


-3

স্ট্যাটিক সদস্য ফাংশনগুলি অবশ্যই সেই শ্রেণীর স্থিতিশীল ভেরিয়েবলগুলি উল্লেখ করে। সুতরাং আপনার ক্ষেত্রে,

static void CP_StringToPString( std::string& inString, unsigned char *outString);

যেহেতু আপনার সদস্য ফাংশনটি CP_StringToPstringস্থিতিশীল, সেই ফাংশনের পরামিতিগুলি inStringএবং outStringএটিও স্থির হিসাবে ঘোষণা করা উচিত।

স্ট্যাটিক সদস্য ফাংশনগুলি যে অবজেক্টে কাজ করছে তা বোঝায় না তবে আপনার ঘোষিত ভেরিয়েবলগুলি তার বর্তমান অবজেক্টকে বোঝায় তাই এটি ত্রুটি ফেরায়।

আপনি সদস্য ফাংশন থেকে স্ট্যাটিকটি সরিয়ে ফেলতে পারেন বা সদস্য ফাংশনের জন্য আপনি যে পরামিতি ব্যবহার করেছেন তা স্থির হিসাবে ঘোষণা করার সময় আপনি স্ট্যাটিক যুক্ত করতে পারেন।


2
ইনস্ট্রিং এবং আউটস্ট্রিং স্ট্যাটিক ফাংশনের আর্গুমেন্ট। তারা শ্রেণির সদস্য নয়। এগুলিকে অচল করে রূপান্তর করার দরকার নেই।
999 কে

এটি মোটেও সঠিক নয়। আপনি একটি স্থির সদস্য ফাংশনে অ স্থির যুক্তি রাখতে পারেন। শ্রেণীর সদস্যদের মধ্যে, আপনি কেবল ফাংশনটিতে স্থির সদস্যদের অ্যাক্সেস / সংশোধন করতে পারবেন।
জাচারি ক্রাউস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.