سؤال

كود

 static void MyClass::ThreadEntryStatic()
 {
    //...
 }

 void MyClass::Begin()
 {
         CreateThread(..,ThreadEntryStatic,..);
 }

في حالة التي يتعين علينا أن نستخدم ثابتة في الصف؟

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

المحلول

وهناك ثلاثة أماكن ثابت الكلمة يمكن استخدامها. هو واحد في إعلان البنية / فئة عند هذا السياق يعني أن الأسلوب هو أسلوب فئة بدلا من أسلوب مثيل. وهذا يعني أن هذا الأسلوب يسمى مباشرة ولا تحتاج مثيل. من هذا أسلوب ثابت، لا يمكنك الوصول إلى المتغيرات المثال.

في MyClass.h

struct MyClass
{
  static void ThreadEntryStatic();

  void Begin();
};

في MyClass.cpp

void MyClass::ThreadEntryStatic()
{
}

void MyClass::Begin()
{
  CreateThread(.., MyClass::ThreadEntryStatic, ...);
}

وهناك حالة ثانية حيث الكلمة الأساسية ثابتة هو استخدام هي في نطاق ملف حيث كنت لا تريد رؤية المتغير أعلن أن تكون مرئية خارج الملف. يمكنك أيضا استخدام مساحة الاسم المجهول لهذا أيضا.

وهناك حالة ثالثة حيث يتم استخدام الكلمة الأساسية ثابتة هي في نطاق طريقة ويتم الاحتفاظ قيمة بين الإعدام وظيفة (وتهيئة مع الاحالة أول مرة).

نصائح أخرى

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

ووكمثال ملموس،

class Test{
      static void foo();      
};

static void Test::foo(){
    // code here
}

ولن تجميع، لم تكن قادرة على إعلان وظيفة مع الكلمة الأساسية ثابتة خارج تعريف فئة. كنت ببساطة لديك لإزالة الكلمة الأساسية ثابتة عند تنفيذ المهمة.

class Test{
      static void foo();      
};

void Test::foo(){
    // code here
}

ولمست عدد قليل من الناس على هذا، ولكن static تستخدم للربط الداخلي لا ينبغي أن تستخدم بدلا ينبغي للمرء أن استخدام مساحة الاسم مجهول:

namespace
{

void myInternallyLinkedFunction()
{
    // do something
}

int myInternallyLinkedInteger;

class myInternallyLinkedClass
{
public:
    void doSomething();
};

} // anon namespace


void myExternallyLinkedFunction()
{

    ++myInternallyLinkedInteger;
    myInternallyLinkedFunction();
    myInternallyLinkedClass x;
    x.doSomething();
}

ويتم الاحتفاظ قيمة المتغيرات ثابتة بين المكالمات وظيفة. تحقق هذا دخول MSDN للحصول على أمثلة. وقد أوجز تعريف واستخدام أساليب "ثابت" في الإجابة chrish ل

وثابت يمكن استخدامها عند تنفيذ الطبقات المفردة حيث تحتاج إلى أن يكون واحد فقط مثيل لفئة. استخدام انها تعتمد على السياق.

ما يظهر المثال الخاص بك هو "ثابت الدالة العضو موضوع الاستدعاء" النمط. كما يجب أن يكون وظيفة موضوع توقيع WINAPI، فإنه لا يمكن أن تكون دالة عضو العادية، فقط عضو ثابت. كثيرا ما كنت تمر في ذلك موضوع parametr لهذا الاستدعاء، ومن ثم استدعاء عضوا الحقيقي أداء العمل موضوع.

وهناك استخدام واحد فقط من عضو ثابت، وهناك العديد من مختلف. فمن الصعب حقا أن يخمن ما هو الغرض من سؤالك. هل أنت حل بعض المشاكل معينة، أو هل أنت مهتمة فقط حول جميع الاستخدامات الممكنة من أعضاء ثابتة أو وظائف عضو ثابت؟

والمثال أكثر كاملة من "ثابت الدالة العضو موضوع الاستدعاء":

class MyClass
{

  /// background rendering thread
  int ThreadEntry()
  {
     // do the work here
  }

  /// static member callback "proxy"
  static DWORD WINAPI ThreadEntryStatic(void *param)
  {
    return ((EngineDD9 *)param)->ThreadEntry();
  }

  void SpawnThread()
  {
    CreateThread(.., ThreadEntryStatic, ...);
  }

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