2016-08-08 89 views
1

Wenn ich mehrere Variablen in der Basisklasse deklariere, werden sie in jeder abgeleiteten Klasse definiert, oder? Ich möchte nur die Variablen in der Basisklasse für alle abgeleiteten Klasse einmal haben. Beispiel:So initialisieren Sie eindeutige Variablen in der Basisklasse (Vererbung)

class Base{ 
public: 
virtual ~Base(); 

protected: 
Base(); 
int fileIndex; 
}; 

class DerivedA : public Base{ 
public: 
DerivedA(); 
virtual ~DerivedA(); 
void DoSth(); //using fileIndex 
}; 

class DerivedB : public Base{ 
public: 
DerivedB(); 
virtual ~DerivedB(); 
void DoSthDifferent(); //using the same fileIndex 
}; 

Wie kann ich das tun?

+1

Das haben Sie schon gemacht! Mögliches Duplikat: [Private und Protected Members] (http://stackoverflow.com/q/224966/514235) – iammilind

+2

Wenn Sie sagen, dass alle abgeleiteten Klassen denselben fileIndex verwenden sollen, was meinen Sie eigentlich? Alle bisherigen Antworten verstehen, dass alle Basen, egal ob sie Vererbung verwenden oder nicht, denselben zugrunde liegenden fileIndex-Wert verwenden sollten. Aber es scheint, dass Ihr Beispiel für diese Interpretation zu kompliziert ist. –

+0

Ja, meinst du, dass du diese Member nur einmal in der Basis definieren willst, aber in jeder Instanz separate Kopien speichern willst (einschließlich Ableitungen - Standardvererbung), oder möchtest du stattdessen, dass alle Instanzen die gleichen Mitglieder haben ('statisch')) Ich empfehle, diese Flag-Beschreibung zu befolgen: _ "Bitte klären Sie Ihr spezifisches Problem oder fügen Sie zusätzliche Details hinzu, um genau das hervorzuheben, was Sie benötigen. Wie es derzeit geschrieben wird, ist es schwierig, genau zu sagen, was Sie fragen Diese Frage. "_ –

Antwort

2

So stellen Sie fileIndex eine static Variable:

static int fileIndex; 

Dann alle Instanzen von allen abgeleiteten Klassen den gleichen Wert

1

ich dies unter der Annahme, teilen ist keine Datei-Index in einigen globalen Protokoll, das Du musst sauber bleiben. Ein static wird dafür tun.

Verwenden Sie die Komposition anstelle von (Missbrauch) Vererbung.

class FileAccessor 
{ 
    int fileIndex; 
    // Your stuff 
}; 

Class A 
{ 
    std::shared_ptr<FileAccessor> mFileAccessor; 
public: 
    A(std::shared_ptr<FileAccessor> fAccesor) : mFileAccessor(fAccesor) {} 

    void DoSth() { /* use mFileAccessor*/ } 
}; 

Class B 
{ 
    std::shared_ptr<FileAccessor> mFileAccessor; 
public: 
    B(std::shared_ptr<FileAccessor> fAccesor) : mFileAccessor(fAccesor) {} 

    void DoSth() { /* use mFileAccessor*/ } 
}; 

int main() 
{ 
    auto fAccesor = std::make_shared<FileAccessor>(); 
    A a{fAccesor}; 
    B b{fAccesor}; 
} 

diese Weise, wenn Sie Zugang synchronisieren müssen, bleibt die Logik in FileReader.

Wenn Objekte Objekte gemeinsam nutzen müssen, machen Sie sie explizit, indem Sie den Status in ein anderes Objekt einbeziehen.