* .Cpp ফাইলে স্ট্যাটিক ক্লাস সদস্য ফাংশন কীভাবে প্রয়োগ করতে হয়?


125

staticহেডার ফাইলটিতে না করে ক্লাস সদস্য ফাংশনগুলি * .cpp ফাইলে প্রয়োগ করা সম্ভব ?

সব staticকাজ সবসময় হয় inline?


4
আপনি কী ব্যাখ্যা করতে পারবেন যে আপনি কেন আপনার সিপিপি ফাইলে স্ট্যাটিক ক্লাস মেমবার ফাংশনটি "প্রয়োগ করতে পারবেন না"? কোন ত্রুটি? আপনি কোথায় এই ধরনের ফাংশন বাস্তবায়ন করেন তা সম্পর্কে সাধারণত সীমাবদ্ধতা থাকে না।
শীতকালীন টিআরটি

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

7
আপনি যখন প্রয়োগ করেন, staticকীওয়ার্ডটি পুনরাবৃত্তি করবেন না । লিখুন staticশব্দ শুধুমাত্র হেডার ফাইলে বর্গ সংজ্ঞা
SomethingSomething

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

উত্তর:


153

এইটা.

test.hpp:

class A {
public:
    static int a(int i);
};

test.cpp:

#include <iostream>
#include "test.hpp"


int A::a(int i) {
    return i + 2;
}

using namespace std;
int main() {
    cout << A::a(4) << endl;
}

এগুলি সর্বদা ইনলাইন হয় না, না, তবে সংকলক সেগুলি তৈরি করতে পারে।


47

এটা চেষ্টা কর:

header.hxx:

class CFoo
{
public: 
    static bool IsThisThingOn();
};

class.cxx:

#include "header.hxx"
bool CFoo::IsThisThingOn() // note: no static keyword here
{
    return true;
}

9

helper.hxx

class helper
{
 public: 
   static void fn1 () 
   { /* defined in header itself */ }

   /* fn2 defined in src file helper.cxx */
   static void fn2(); 
};

helper.cxx

#include "helper.hxx"
void helper::fn2()
{
  /* fn2 defined in helper.cxx */
  /* do something */
}

A.cxx

#include "helper.hxx"
A::foo() {
  helper::fn1(); 
  helper::fn2();
}

সি ++ স্ট্যাটিক ফাংশনগুলি কীভাবে পরিচালনা করে তা সম্পর্কে আরও জানতে: সি ++ এ স্থিতিশীল সদস্য ফাংশনগুলি কি একাধিক অনুবাদ ইউনিটে অনুলিপি করা হয়?


2

হ্যাঁ আপনি * .cpp ফাইলে স্থির সদস্য ফাংশন সংজ্ঞায়িত করতে পারেন। যদি আপনি এটি শিরোনামে সংজ্ঞায়িত করেন তবে সংকলক ডিফল্টরূপে এটি ইনলাইন হিসাবে বিবেচনা করবে। তবে, এর অর্থ এই নয় যে স্থির সদস্য ফাংশনের পৃথক অনুলিপি কার্যকর করা যায়। এই সম্পর্কে আরও জানতে দয়া করে এই পোস্টটি অনুসরণ করুন: একাধিক অনুবাদ ইউনিটগুলিতে সি ++ এ স্থির সদস্য ফাংশনগুলি কি অনুলিপি করা হয়?


আপনি যদি শ্রেণিবদ্ধভাবে এটি সংজ্ঞায়িত করেন তবে এটি স্বয়ংক্রিয়ভাবে ডিফল্ট হবে। যদি বর্গ শরীরের বাইরে হেডারের মধ্যে, এটি ভাল চিহ্নিত করা হয়েছিল পারেন inlineবা templateঅথবা আপনি linker থেকে একাধিক সংজ্ঞা ত্রুটি পাবেন।
বেন ভয়েগট

2

আপনার হেডার ফাইলটিতে foo.h বলুন

class Foo{
    public:
        static void someFunction(params..);
    // other stuff
}

আপনার বাস্তবায়ন ফাইলে foo.cpp বলুন

#include "foo.h"

void Foo::someFunction(params..){
    // Implementation of someFunction
}

অনেক গুরুত্বপূর্ণ

আপনি যখন আপনার প্রয়োগকারী ফাইলে স্থির ফাংশনটি প্রয়োগ করছেন তখন আপনি আপনার পদ্ধতি স্বাক্ষরে স্থির কীওয়ার্ডটি ব্যবহার করবেন না তা নিশ্চিত করুন।

শুভকামনা


1

@ ক্রোবার, আপনি ঠিক বলেছেন যে মাল্টি-ফাইলের উদাহরণগুলির অভাব রয়েছে, তাই আমি আশা করি নিম্নলিখিতটি ভাগ করে নেওয়ার সিদ্ধান্ত নিয়েছি যে এটি অন্যকে সহায়তা করে:

::::::::::::::
main.cpp
::::::::::::::

#include <iostream>

#include "UseSomething.h"
#include "Something.h"

int main()
{
    UseSomething y;
    std::cout << y.getValue() << '\n';
}

::::::::::::::
Something.h
::::::::::::::

#ifndef SOMETHING_H_
#define SOMETHING_H_

class Something
{
private:
    static int s_value;
public:
    static int getValue() { return s_value; } // static member function
};
#endif

::::::::::::::
Something.cpp
::::::::::::::

#include "Something.h"

int Something::s_value = 1; // initializer

::::::::::::::
UseSomething.h
::::::::::::::

#ifndef USESOMETHING_H_
#define USESOMETHING_H_

class UseSomething
{
public:
    int getValue();
};

#endif

::::::::::::::
UseSomething.cpp
::::::::::::::

#include "UseSomething.h"
#include "Something.h"

int UseSomething::getValue()
{
    return(Something::getValue());
}


0

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

যার অর্থ আপনার স্থিতিশীল সদস্য ফাংশনটির ঘোষণা এবং সংজ্ঞা সত্যই একই ফাইলটিতে ছিল ...

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