سؤال

ببساطة جدا:

لدي الدرجة التي تتكون في معظمها من الساكنة العامة أعضاء, حتى أستطيع أن مجموعة وظائف مماثلة معا التي لا تزال تسمى من الفئات الأخرى/وظائف.

على أي حال يجب تحديد اثنين من ساكنة char غير الموقعة المتغيرات في صفي العامة النطاق عندما أحاول تعديل هذه القيم في نفس الفئة' منشئ أنا الحصول على "حل الرمز الخارجية" خطأ في التجميع.

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

    ...

    test();
};

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

أنا جديد على C++ لذلك يذهب من السهل على لي.لماذا لا يمكنني فعل هذا ؟

هل كانت مفيدة؟

المحلول

نسيت إضافة تعريفات لمباراة الخاص بك الإعلانات من X و Y

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

في مكان ما.قد ترغب أيضا تهيئة ثابت الأعضاء

unsigned char test::X = 4;

و مرة أخرى, يمكنك أن تفعل ذلك في تعريف (عادة في الملف CXX) ليس في الإعلان (الذي غالبا ما يكون في .ساعة الملف)

نصائح أخرى

وثابت الإعلانات أعضاء البيانات في تعريف فئة ليست تعريف منهم. لتحدد لهم يجب ان تفعل هذا في ملف .CPP لتجنب تكرار حرف.

والبيانات الوحيد الذي يمكن أن تعلن وتحديد الثوابت هي ثابتة لا تتجزأ. (قيم enums ويمكن استخدام قيم ثابتة أيضا)

وقد تحتاج إلى إعادة كتابة التعليمات البرمجية الخاصة بك على النحو التالي:

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

test::test() {
}

إذا كنت تريد أن يكون لك القدرة على تعديل المتغيرات ثابتة (وبعبارة أخرى عندما يكون غير مناسب لاعلان لهم كما CONST)، يمكنك فصل لكم كود بين .H و.CPP بالطريقة التالية:

و.H:

class test {
public:

  static unsigned char X;
  static unsigned char Y;

  ...

  test();
};

و.CPP:

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.
}

وبما أن هذا هو موضوع أول SO التي يبدو أن تأتي بالنسبة لي عند البحث عن "الظواهر التي لم تحل مع أعضاء CONST ثابت" بشكل عام، سأترك تلميح آخر لحل مشكلة واحدة مع الظواهر التي لم تحل هنا:

وبالنسبة لي، كان الشيء الذي كنت قد نسيت للاحتفال بلدي __declspec(dllexport) تعريف الفئة، وعندما دعا من فئة أخرى (خارج حدود دلل تلك الفئة و)، وأنا بالطبع حصلت على خطأ بلدي الخارجية لم يتم حلها.
ومع ذلك، من السهل أن ينسى عندما كنت تغيير فئة المساعد الداخلية إلى واحد يمكن الوصول إليها من أي مكان آخر، لذلك إذا كنت تعمل في مشروع ربط حيوي، قد تحقق، وكذلك ذلك أيضا.

وفي حالتي، وأنا أعلن متغير ثابت واحد في .H الملف، مثل

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

ووفي myClass.cpp، حاولت استخدام هذا m_nMyVar. انها حصلت على خطأ LINK مثل:

والخطأ 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top