স্থির শ্রেণীর সদস্যদের ক্ষেত্রে অমীমাংসিত বাহ্যিক প্রতীক


129

খুব সহজভাবে:

আমার একটি ক্লাস রয়েছে যা বেশিরভাগ স্থির পাবলিক সদস্য নিয়ে গঠিত, তাই আমি একই ধরণের ফাংশনগুলি একসাথে গ্রুপ করতে পারি যা এখনও অন্যান্য শ্রেণি / ফাংশন থেকে কল করতে হয়।

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

class test 
{
public:
    static unsigned char X;
    static unsigned char Y;

    ...

    test();
};

test::test() 
{
    X = 1;
    Y = 2;
}

আমি সি ++ তে নতুন তাই আমার কাছে সহজ। আমি কেন এটি করতে পারি না?

উত্তর:


145

আপনি এক্স এবং ওয়াইয়ের আপনার ঘোষণার সাথে মিল রাখতে সংজ্ঞাগুলি যুক্ত করতে ভুলে গেছেন

unsigned char test::X;
unsigned char test::Y;

কোথাও। আপনি কোনও স্থির সদস্যকে আরম্ভ করতে চাইতে পারেন

unsigned char test::X = 4;

এবং আবারও, আপনি এটি সংজ্ঞাতে করেন (সাধারণত একটি সিএক্সএক্স ফাইলে) ঘোষণাপত্রে নয় (যা প্রায়শই একটি। এইচ ফাইলে থাকে)


4
আপনি যদি কেবল শিরোনামের পাঠাগারটি লিখছেন তবে সিপিপি ফাইল এড়াতে আপনি এই কৌশলটি ব্যবহার করতে পারেন: stackoverflow.com/questions/11709859/…
শীতল শাহ

62

ক্লাস ঘোষণায় স্থিতিশীল ডেটা সদস্যদের ঘোষণাগুলি তাদের সংজ্ঞা নয়। এগুলি সংজ্ঞায়িত করতে .CPPনকল চিহ্নগুলি এড়ানোর জন্য আপনার ফাইলটিতে এটি করা উচিত ।

আপনি যে ডেটা ঘোষণা করতে এবং সংজ্ঞা দিতে পারেন তা হ'ল অবিচ্ছেদ্য স্থিতিশীল ধ্রুবক। (মানগুলি enumsধ্রুবক মান হিসাবেও ব্যবহার করা যেতে পারে)

আপনি আপনার কোডটি আবার লিখতে চান:

class test {
public:
  const static unsigned char X = 1;
  const static unsigned char Y = 2;
  ...
  test();
};

test::test() {
}

যদি আপনি স্থিতিশীল ভেরিয়েবলগুলি সংশোধন করার ক্ষমতা রাখতে চান (অন্য কথায় এগুলি কনস্ট হিসাবে ঘোষণা করা অনুচিত হয়), আপনি নিম্নলিখিত কোডের মধ্যে .Hএবং আপনার কোডকে আলাদা করতে পারেন .CPP:

.এইচ:

class test {
public:

  static unsigned char X;
  static unsigned char Y;

  ...

  test();
};

.সিপিপি:

unsigned char test::X = 1;
unsigned char test::Y = 2;

test::test()
{
  // constructor is empty.
  // We don't initialize static data member here, 
  // because static data initialization will happen on every constructor call.
}

কেন এখানে .CPP এ, এটি "স্বাক্ষরবিহীন চার্ট পরীক্ষা :: এক্স = 1;" "পরীক্ষার পরিবর্তে: এক্স = 1;"? স্ট্যাটিক ভেরিয়েবল এক্স ইতিমধ্যে সংজ্ঞায়িত হয়েছে, কেন এখনও "স্বাক্ষরবিহীন চর" দরকার? @sergtk
পেনি

@ পেনি কারণ "পরীক্ষা :: এক্স = 1;" একটি অ্যাসাইনমেন্ট হিসাবে ব্যাখ্যা করা হয়, যেখানে আমরা যা করার চেষ্টা করছি এটি একটি সংজ্ঞা।
বেনামে 1847

4

যেহেতু এটি সাধারণভাবে "স্ট্যাটিক কনস্ট সদস্যদের সাথে অমীমাংসিত এক্সটার্নালস" অনুসন্ধান করার সময় আমার কাছে উপস্থিত হয়েছিল বলে মনে হয়েছিল, অমীমাংসিত এক্সটার্নালগুলির সাথে একটি সমস্যা সমাধানের জন্য আমি অন্য ইঙ্গিতটি এখানে রেখে যাব:

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


2

আমার ক্ষেত্রে, আমি .h ফাইলের মধ্যে একটি স্থিতিশীল ভেরিয়েবল ঘোষণা করেছিলাম

//myClass.h
class myClass
{
static int m_nMyVar;
static void myFunc();
}

এবং myClass.cpp এ, আমি এই m_nMyVar ব্যবহার করার চেষ্টা করেছি। এটি এর মতো লিঙ্কের ত্রুটি পেয়েছে:

ত্রুটি LNK2001: অমীমাংসিত বাহ্যিক প্রতীক "পাবলিক: স্ট্যাটিক ক্লাস ... লিঙ্ক ত্রুটি সম্পর্কিত সিপিপি ফাইলটি দেখে মনে হচ্ছে:

//myClass.cpp
void myClass::myFunc()
{
myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error
}

সুতরাং আমি myClass.cpp শীর্ষে কোড নীচে যোগ করুন

//myClass.cpp
int myClass::m_nMyVar; //it seems redefine m_nMyVar, but it works well
void myClass::myFunc()
{
myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error
}

তারপরে LNK2001 চলে গেছে।


0

আমার ক্ষেত্রে, আমি ভুল সংযোগ ব্যবহার করছিলাম।
এটি সি ++ (ক্লায়েন্ট) পরিচালনা করা হয়েছিল তবে দেশীয় রফতানি সহ। আমি লিঙ্কারে যোগ করেছি -> ইনপুট -> সমাবেশ লিঙ্কটি রিসোর্সটি লাইব্রেরির dll থেকে যেখান থেকে ফাংশন রফতানি করা হয়। তবে নেটিভ সি ++ লিঙ্কিংয়ের জন্য সিপিতে সঠিকভাবে "দেখুন" প্রয়োগের জন্য .lib ফাইলের প্রয়োজন হয়, সুতরাং আমার জন্য .lib ফাইলটি লিঙ্কারে -> ইনপুট -> অতিরিক্ত নির্ভরতা যুক্ত করতে সহায়তা করেছিল।
[সাধারণত পরিচালিত কোড dll রফতানি এবং আমদানি ব্যবহার করে না, এটি উল্লেখগুলি ব্যবহার করে তবে এটি ছিল অনন্য পরিস্থিতি]

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