الاستعلام عن متغيرات الأعضاء الثابتة لفئة في C ++

StackOverflow https://stackoverflow.com/questions/806846

  •  03-07-2019
  •  | 
  •  

سؤال

آسف إذا كان هذا السؤال يبدو تافهًا للكثيرين هنا.

في رمز C ++ هناك شيء ما أدناه:

class Foo
{
public:
   static int bands;
   ...
   ...
private:
   ...
   ...

}//class definition ends

int Foo::bands; //Note: here its not initialized to any value!
  1. لماذا يتم الإعلان عن البيان أعلاه مرة أخرى عندما يتم الإعلان عن "النطاقات" داخل الفصل على أنه ثابت؟

  2. هل يمكن الإعلان أيضًا عن متغير ثابت كمتغير خاص في أي فئة؟

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

المحلول

يلاحظ C ++ تمييزًا بين إعلان و تعريف. bands تم إعلانه داخل الفصل ، ولكن لم يتم تعريفه.

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

نصائح أخرى

أ) هناك حاجة لأن هذه هي الطريقة التي تم بها تصميم اللغات.

ب) يتم تهيئة المتغيرات الثابتة بواسطة مُنشئها الافتراضي ، أو إلى الصفر لأنواع مدمجة.

ج) نعم ، يمكن أن تكون (وعادة ما تكون) خاصة.

ألق نظرة على هذا السؤال.

يتعلق الأمر بملفات OBJ ، وكيفية استخدامها ، وكيف يتم اكتشاف عناوين الذاكرة للمتغيرات التي يتم تحديدها عالميًا من خلال عملية الارتباط. تحتوي ملفات الكائنات على عناوين جميع البيانات والوظائف العالمية المحددة في CPP المقابلة. يقومون بتخطيط بعض الذاكرة بطريقة نسبية لإخبار Liker أين يمكن العثور على هذه Vars/Funcs في هذا الملف. على سبيل المثال

function doFoo can be found 0 bytes from beginning of this file
int foo::bands can be found 12 bytes from beginning of this file
etc

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

foo.h

extern int bands; 

foo.cpp

#include "foo.h"
int bands;

foo.obj:

int bands can be found 0 bytes from the beginning of this file

تنص الكلمة الرئيسية "الخارجي" على أن هذا الاسم صالح وسيتم حل عنوانه في وقت الرابط. كل من تضمن "foo.h" وأراد استخدام المتغير العالمي "Bands" يمكن أن يستخدمه الآن. في وقت الرابط ، رابط سوف تكتشف أن العصابات كانت موجودة في foo.obj. إذا نسيت وضع "int bands" في foo.obj ، فستحصل على خطأ في الارتباط ، وعليك أن تحلها.

في C ++ باستخدام ثابت في إعلان الفصل الأول. أنت تخبر المستخدمين بوجود هذا الشيء المسمى "Foo :: Bands" وأين ستعيش سيحصلون في وقت الرابط. في وقت لاحق أسفل السطر ، يرى الرابط أنه في foo.obj ، Foo :: Bands موجودة ، ويمكن حل جميع الإشارات إلى Foo :: Bands.

ما أفهمه هو أنك ستحتاج فقط إلى إعلان Foo :: Bands إذا كنت تخطط لاستخدامه قبل إنشاء مثيل من صفك. في الأساس ، عندما تعلن ثابتًا في فئة C ++ ، توجد نسخة واحدة فقط من هذا المتغير لجميع مثيلات تلك الفئة. ومع ذلك ، لا يمكنك عادة الوصول إلى Foo :: Bands حتى يتم الإعلان عن مثيل من الفصل.

فمثلا:

مؤشرات للأعضاء

#include <iostream>
using namespace std;

class X {
public:
  int a;
  void f(int b) {
    cout << "The value of b is "<< b << endl;
  }
};

int main() {

  // declare pointer to data member
  int X::*ptiptr = &X::a;

  // declare a pointer to member function
  void (X::* ptfptr) (int) = &X::f;

  // create an object of class type X
  X xobject;

  // initialize data member
  xobject.*ptiptr = 10;

  cout << "The value of a is " << xobject.*ptiptr << endl;

  // call member function
  (xobject.*ptfptr) (20);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top