2017-12-08 2 views
0

Stellen wir uns vor, ich hätte einen Code, der das Funktionieren eines landesweiten Bildungssystems simuliert. Dieses Land enthält Cities, die Schools enthalten, die Classes enthalten, die Students enthalten. Ich verwende einen globalen Singleton namens CountryInformation, auf den alle Klassen (City, School, Class und Students) zugreifen.Wie können Objekte auf Attribute der Klasse zugreifen, in der sie enthalten sind?

Ich möchte meinen Code erweitern, um mehrere Länder zu betrachten. Jedes Land benötigt einen eigenen CountryInformation, daher ist CountryInformation kein Singleton mehr. Ich möchte, dass jedes Element in einem gegebenen Country Zugriff auf die mit ihrem Land verbundenen countryInformation hat. Wie kann ich das machen?

Eine vereinfachte Version des Problems, dass unten zu berücksichtigen ist, ist mein aktueller Code

int info = 3; 

class City 
{ 
public: 
    void foo(){std::cout << info << std::endl;} 
}; 

class Country 
{ 
public: 
    City city; 
    void callFoo(){this->city.foo();} 
}; 

int main() 
{ 
    Country C; 
    C.callFoo(); 
} 

und ich mag nun so etwas wie

class City 
{ 
public: 
    void foo(){std::cout << info << std::endl;} 
}; 

class Country 
{ 
public: 
    City city; 
    int info; 
    void callFoo(){this->city.foo();} 
    Country(int i):info(i){} 
}; 

int main() 
{ 
    std::vector<Country> countries; 
    Country C1(0); 
    Country C2(0); 
    countries.push_back(C1); 
    countries.push_back(C2); 
    countries[0].callFoo(); 
    countries[1].callFoo(); 
} 

aber der obige Code nicht kompiliert haben, wie Das Stadtobjekt in einem bestimmten Land hat keinen Zugriff auf das Attribut des Länderobjekts.

Ich habe über Freundschaft und verschachtelte Klassen nachgedacht, aber ich versäume es, meinen Kopf darum zu wickeln, wie man diesen Zugang gibt.

EDIT

Ich möchte die Notwendigkeit eines jeden City, School und Student vermeiden, einen Zeiger zu tragen. Ein Zeiger ist typischerweise 4 bis 8 Bytes und ein Student ist typischerweise 8 Bytes. Das würde also den RAM-Bedarf verdoppeln.

+0

Übergeben Sie den "Dies" -Zeiger des Länderobjekts an den Ersteller der Stadt, damit die Stadt auf die Teile des Landes zugreifen kann. Wenn die Stücke privat sind, müssen Sie City zu einem "Freund" machen. –

+0

Vielleicht eine gemeinsame Basisklasse für 'city' und' country', die 'int info' als Membervariable hat. – macroland

+0

@JerryJeremiah Sie schlagen vor, dass jede "Stadt", jede "Schule" und besonders. jeder 'Student' sollte einen Zeiger auf das Land tragen, in dem er enthalten ist? Das würde eine Menge zusätzlichen RAM bedeuten, da jeder Student typischerweise nur 8 Bytes hat. –

Antwort

0

Ihre Klassen sind nicht "verschachtelt". Eine Klasse hat einfach die anderen Klassen als Mitglieder. City Objekte können nur mit Country Objekten über die öffentliche API kommunizieren. Allerdings tatsächliche verschachtelte Klassen oder innere Klassen sind können die privaten Variablen der äußeren Klasse zugreifen:

class Country 
{ 
    class City 
    { 
    public: 
    City(Country& c) : country(c) {} 
    void foo() { 
     country.info = 1; 
    } 
    private: 
    Country& country; 
    }; 
    int info; 
}; 

So oder so, werden Sie ausdrücklich Country Objekt zum City Objekt übergeben.

Verwandte Themen