2016-12-14 6 views
0

Ich habe ein Problem mit einigen geerbten Klassen und deren Basisklasse.Ändern der Basisklasse in C++

Zum Beispiel:

base class{ 

int x,y; // Doesnt really matter 
int counter; 

public: 

class(int x, int y):x(x), y(y), counter(1){} 

void add_counter(){counter++;} 
//stuff 
virtual ~base(){} 
} 



class1:public base{ 

public: 

class1():base(1,2){} 
} 

Jeder meiner geerbten Klassen (die ich ein paar haben) sie alle passieren die x, y voneinander verschieden. Und dann möchte ich diesen Zähler erhöhen, wenn ich ihn anrufe.

Das Problem, mit dem ich konfrontiert bin, ist, dass der Zähler NUR auf dieser Iteration erhöht. Kein Objekt wird neu erstellt (weil ich debuggte). Wenn ich den add_counter für die Klasse1 aufrufe, wird es von 1 auf 2 erhöht, aber wenn ich es noch einmal anrufe, wird es gleich sein (1 zu 2).

Was fehlt mir hier?

Vielen Dank.

+3

Können Sie bitte eine [MCVE] des Codes erstellen Sie mit ein Problem haben? – NathanOliver

+2

Überprüfen Sie, wie eine Klasse definiert ist: Es ist nicht 'Basisklasse {..}', sondern 'Klassenbasis {...}'. Und wenn 'Derived' von' base' abgeleitet ist, dann 'class Derived: public base {...}'. – Ripi2

Antwort

1

Was fehlt mir hier?

Es scheint mir, dass Sie deren Typen gebaut Spur der Anzahl der Objekte behalten möchten von Base ableiten.

In diesem Fall müssen Sie counter eine static Membervariable machen, die Sie add_counter eine static Memberfunktion zu machen erfordert.

jedoch, die Sie benötigen, um:

  1. Decrement die Zählung in dem destructor.
  2. Fügen Sie einen Kopierkonstruktor in Base hinzu, um sicherzustellen, dass Objekte, die mit einem Kopierkonstruktor erstellt wurden, ebenfalls gezählt werden.

Hier ist eine vereinfachte Version von base zu tun, dass:

class base 
{ 
    public: 

    base() { inrement_counter(); } 

    base(base const& copy) { inrement_counter(); } 

    virtual ~base(){ decrement_counter(); } 

    private: 

    static int counter; 
    static void inrement_counter() {++counter;} 
    static void decrement_counter() {--counter;} 
} 

int base::counter = 0; 

Wenn Sie den Überblick über die Anzahl der derived1 Objekte konstruiert behalten möchten, werden Sie die Buchhaltung Code hinzufügen müssen, um derived1. Sie können eine Klassenvorlage erstellen, um diesen Prozess zu optimieren.

Beispiel:

template <typename T> 
struct ObjectCounter 
{ 
    ObjectCounter() { inrement_counter(); } 

    ObjectCounter(ObjectCounter const& copy) { inrement_counter(); } 

    virtual ~ObjectCounter(){ decrement_counter(); } 

    static int counter; 
    static void inrement_counter(){++counter;} 
    static void decrement_counter(){--counter;} 
}; 

template <typename T> 
int ObjectCounter<T>::counter = 0; 

class base 
{ 
}; 

class derived1 : public base, public ObjectCounter<derived1> 
{ 
}; 

class derived2 : public base, public ObjectCounter<derived2> 
{ 
}; 

#include <iostream> 

int main() 
{ 
    derived1 d1; 
    derived2 d2; 
    auto d3 = d2; 

    std::cout << d1.counter << std::endl; 
    std::cout << d2.counter << std::endl; 
} 

Ausgang:

1 
2 
+0

Nun, in der Tat habe ich einen Zähler, dass es nicht für die Objekte erstellt wurde, sondern für etwas anderes. Lassen Sie uns sagen, ich habe Basisklasse und geerbt1, geerbt2 .... und so weiter. Und all diese Vererbungen haben ihre eigenen x und y (deshalb ist es in der Basis), aber ich habe auch eine andere Variable, die auch in allen vererbten Klassen vorhanden ist (z. B. Zähler) und ich möchte sie unabhängig voneinander erhöhen oder verringern . Ich kenne keinen Weg, dies zu tun. Es ist nicht für jedes konstruierte Objekt. Ich habe nur 1 Objekt geerbt und ich möchte in der Lage sein, diesen Zähler (der in der Basis ist) zu ändern.Vielen Dank!! – Miguel

+0

@ MiguelRuivo, Sie können das nicht tun. Die Basisklasse darf keine Variable für "derived1", eine zweite für "derived2", eine dritte für "derived3" usw. haben. Wenn Sie die Anzahl der konstruierten "derived1" -Objekte verfolgen wollen, brauchen Sie um den Buchhaltungscode zu "derived1" hinzuzufügen. Sie können eine Klassenvorlage erstellen, um diesen Prozess zu optimieren. –

Verwandte Themen