3 Stimmen

Wie initialisiert man die Mitglieder des Unterobjekts der Basisklasse mit 0?

class A
{
  public: int a,b,c;
};

class B: public A
{
   public: int d;
   B():d(0){} // Some hackery needed here
};

int main()
{
   B obj;
   std::cout<< obj.a << std::endl; // garbage
   std::cout<< obj.b << std::endl; // garbage
   std::cout<< obj.c << std::endl; // garbage
   std::cout<< obj.d << std::endl; // 0
}

Wie können die Datenelemente a, b und c des Unterobjekts auf 0 initialisiert werden? Es ist mir nicht erlaubt, die Klasse A zu ändern.

8voto

Prasoon Saurav Punkte 88056

Versuchen Sie

B() : A() , d(0){}

A()-Wert initialisiert A und da A ein POD ist, werden die Mitglieder standardmäßig (null) initialisiert


4voto

CashCow Punkte 29849

Ich habe dies getestet, da ich dachte, es könnte funktionieren (auch ohne Prasoons Antwort)

B::B() : A(), d(0)
{
}

könnte funktionieren, weil Sie dann A "initialisieren".

Das war übrigens nicht der Fall. Ausgabe: 1,32,123595988

Das würde aber funktionieren:

// put this in B.cpp anonymous namespace
const A a_init = { 0, 0 ,0 };

gefolgt von:

B::B() : A( a_init), d(0)
{
}

Ich teste mit g++ 4.3.2. Jetzt DIESE gearbeitet:

B::B() : A(A()), d(0)
{
}

1voto

schnaader Punkte 47961

Vielleicht übersehe ich etwas, aber wie wäre es damit?

class B: public A
{
    public: int d;
    B():d(0){a=b=c=0;}
}

1voto

Vijay Punkte 62277

Deklarieren Sie den Konstruktor der abgeleiteten Klasse wie unten gezeigt

class B: public A
{
   public: int d;
   B():a(0),b(0),c(0),d(0)
   {

   }

};

1voto

Bo Persson Punkte 88207

Der richtige Weg ist natürlich, dass der Konstruktor von A seine Mitglieder initialisiert. Andernfalls, da die Mitglieder nicht privat sind, können Sie ihnen Werte aus dem B-Konstruktor zuweisen.

a = 0;

usw., funktioniert tatsächlich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X