2017-12-08 6 views
0

私は、国の教育システムの作業をシミュレートするコードを持っているとしましょう。この国には、Schoolsを含むCitiesが含まれており、Classesを含み、Studentsを含んでいます。すべてのクラス(CitySchoolClassStudents)がアクセスしているCountryInformationというグローバルシングルトンを使用します。オブジェクトは、オブジェクトが含まれているクラスの属性にどのようにアクセスできますか?

いくつかの国を検討するようにコードを拡張したいと思います。各国は独自のCountryInformationが必要です。したがって、CountryInformationはもはやシングルトンではありません。特定のCountryに含まれる各要素は、その国に関連付けられたcountryInformationにアクセスできるようにしたいと考えています。どうやってやるの?

問題の簡易版は、以下の私の現在のコード

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(); 
} 

であると私は今

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(); 
} 

のようなものを持っていると思いますが、上記のコードはのようにコンパイルされないことを考慮することです指定された国のCityオブジェクトはCountryオブジェクトの属性にアクセスできません。

私は友人関係やネストされたクラスを検討していましたが、私はこのアクセスを与える方法を頭に入れません。

EDIT

私の周りのポインタを運ぶためにあらゆるCitySchoolStudentの必要性を回避したいと思います。ポインタは通常4〜8バイトで、Studentは通常8バイトです。そうすることで、RAMの必要性が倍増します。

+0

国オブジェクトの "this"ポインタをCityのコンストラクタに渡すと、CityはCountryの部分にアクセスできます。部分がプライベートである場合、Cityを "友人"にする必要があります –

+0

おそらくメンバ変数として 'int info'を持つ' city'と 'country'の共通基底クラスです。 – macroland

+0

@ JerryJeremiahあなたは、すべての「都市」、すべての「学校」、すべての「学生」はそれが含まれる国へのポインタを運ぶべきですか?これは、すべての生徒が通常8バイトのみであるため、余分なRAMをかなり節約することになります。 –

答えて

0

あなたのクラスは「ネストされていません」 1つのクラスは他のクラスをメンバーとして持つだけです。 Cityオブジェクトは、公開APIを介してCountryオブジェクトとしか通信できません。しかし、実際のネストされたクラス、または内部クラスは、は、外部クラスのプライベート変数にアクセスすることができます:

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

いずれかの方法は、あなたが明示的CityオブジェクトにCountryオブジェクトを渡す必要があります。

関連する問題