ルチアンの答えは正しいですが、あなたが何を考えているかわかりますので、彼の答えを補強させてください。Roomオブジェクトで家の名前にアクセスできるようにしたいのですが、部屋は家を構成し、家を制御することはできないため、部屋に家の参照を含めることはできません。仮定しましょう:
class House;
class Room
{
public:
string getMyHouseName(); //return m_myHouse->getName();
void demolish(); //demolish the room
//other methods...
private:
House* m_myHouse;
};
class House
{
public:
string getName();
void demolish(); //demolish the house, calling demolish() of all rooms in "m_rooms"
//other methods...
private:
vector<Room*> m_rooms;
const string m_name;
};
ご覧のとおり、家の名前にアクセスできます。それで問題ありませんが、部屋から家を取り壊す力もあります。Roomクラス内で「m_myHouse->demolish()」を使用するべきではないことはわかっていますが、使用できます。これはよくある間違いであり、必要以上にオブジェクトへのアクセスを提供します。したがって、この問題の解決策は、constメソッドとconstオブジェクトを使用することです。披露させて:
class House;
class Room
{
public:
string getMyHouseName(); //return m_myHouse->getName();
void demolish(); //demolish the room
//other methods...
private:
const House* m_myHouse;
};
class House
{
public:
string getName() const;
void demolish(); //demolish the house, calling demolish() of all rooms in "m_rooms"
//other methods...
private:
vector<Room*> m_rooms;
const string m_name;
};
これで、Houseの「getName()」はconstメソッドになります。つまり、このメソッドはHouseのconstインスタンスから呼び出すことができます。これは、オブジェクトの状態を変更しないため、Houseから情報を読み取るだけです。また、「demolish()」は、家の状態を変更する(部屋を解体する)可能性があるため、constではありません。
そこで、「読み取り専用」オブジェクトであるHouse inaRoomのconst参照を配置します。今、部屋はもう家を変える力を持っていません。Roomでm_myHouse->demolish()を呼び出すことはできません。その制御はできませんが、Houseは任意の部屋を取り壊すことができます。それがハウスが「部屋を持っている」方法です。