Frage

EDIT: erklären sie privat ein Tippfehler war, ich regelte es:

auf eine andere Frage Verkehr, wenn ich eine statische Variable in einer Klasse deklariert, abgeleitet dann eine Klasse aus, dass, gibt es eine Möglichkeit, die statische Variable als einzelne für jede Klasse zu erklären. Dh:

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

nicht definiert, dass zwei verschiedene statische Variablen x, eine für A und eine für B, oder werde ich einen Fehler für x neu zu definieren, und wenn ich einen Fehler tun bekommen, wie kann ein ich zwei separate statische Variablen erstellen?

War es hilfreich?

Lösung

Wenn Sie statische Variablen verwenden, könnte es eine gute Idee, um sie zu verweisen ausdrücklich:

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

Auf diese Weise, auch wenn die Klasse „oben“ Ihr in der Hierarchie eine ähnlich benannten Mitglied erstellen entscheidet, wird es nicht, Ihren Code brechen. Ebenso ich uns in der Regel versuchen, das this Schlüsselwort, wenn die normalen Mitgliederfelder zugreifen.

Aktualisiert C ++ Syntax.

Andere Tipps

Das schafft zwei getrennte statische Variablen.

Beachten Sie, dass implizit erklärt haben, diese private:

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

Was bedeutet die Variablen nicht in Konkurrenz zueinander.

Wie schon gesagt, dass erstellt zwei getrennte Variablen:

A::x;

// and 

B::x;

In der Tat, wenn Sie versuchen, in einem Verfahren zum B nur ‚x‘ zu verwenden, werden nur die engere Umfang Definition verwendet werden, bis Sie präziser sind:

#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;
}

Ausgänge:

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

Jemand erwähnte, dass die Zugänglichkeit Zugänglichkeit begrenzen könnte: so dass die variable private Basis wird es nicht das Kind Klasse zugänglich machen. wenn die Variablen haben jedoch zu schützen oder öffentlich, eine explizite Zugriffsmethode verwenden oder sie auf dem lokalen Bereichsregel nur demonstrierte ich.

Wenn Sie eine statische Variable wollen, die jede Klasse einzelnen ist, dass verwendet A - Sie eine Template-Klasse verwenden können
. Für z.B.

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'
};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top