كيفية إعلان اثنين من المتغيرات الثابتة المختلفة؟ (C ++)

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

سؤال

تحرير: أعلن أنها خاصة كانت بيئية، أنا إصلاحها:

فيما يتعلق بسؤال آخر، إذا أعلنت متغير ثابت في الفصل، فستكون هناك فئة من ذلك، هل هناك أي طريقة لإعلان المتغير الثابت كفرد لكل فصل لكل فصل. بمعنى آخر:

class A:
{
public:
static int x;
};
class B:A
{
public:
const static int x;
};

هل هذا يحدد اثنين من المتغيرات الثابتة المختلفة x, ، واحد لأحد وواحد ل b، أو سأحصل على خطأ لإعادة تعريف x, ، وإذا احصل على خطأ، كيف أقوم بإنشاء متغيرات ثابتة منفصلة؟

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

المحلول

عند استخدام المتغيرات الثابتة، قد تكون فكرة جيدة الرجوع إليها بشكل صريح:

public class B:A
{
  public const static int x;
  public int foo()
  {
    return B::x;
  }
}

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

محدث لاستخدام بناء جملة C ++.

نصائح أخرى

التي تخلق اثنين من المتغيرات الثابتة منفصلة.

لاحظ أنك قد أعلنت ضمنيا هذه خاصة:

class A:
{
  private:
  static int x;
};
class B:A
{
  private:
  const static int x;
};

مما يعني أن المتغيرات ليست في المنافسة مع بعضها البعض.

كما قال بالفعل، الذي يخلق اثنين من المتغيرات منفصلة:

A::x;

// and 

B::x;

في الواقع إذا حاولت استخدام "X" فقط بطريقة ب، فسيتم استخدام تعريف النطاق الأقرب فقط حتى تكون أكثر دقة:

#include <iostream>

class A
{
protected:
static int x;

public:
    A() { x = 7; }
};

int A::x = 22;

class B:A
{
static const int x = 42;

public:

    int a_x() const { return A::x; }
    int b_x() const { return B::x; }
    int my_x() const { return x; } // here we get the more local variable, that is B::x.
};

int main()
{
    B b;

    std::cout << "A::x = " << b.a_x() << std::endl;
    std::cout << "B::x = " << b.b_x() << std::endl;
    std::cout << "b's x = " << b.my_x() << std::endl;

    std::cin.ignore();
    return 0;
}

المخرجات:

A::x = 7
B::x = 42
b's x = 42

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

إذا كنت تريد متغير ثابت فردي لكل فصل يستخدم A - يمكنك استخدام فئة القالب.
ل

template<class T> struct A
{
   A() { ++s_var; }
   static int s_var;
};

template<class T> int A<T>::s_var;

stuct B :A<B> {
  B() { ++s_var; }  // this is a different s_var than the one used by 'C' below
};

struct C : A<C> {
  C() { ++s_var; } // this is a different s_var than the one used by 'B'
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top