Luchian的回答是对的,但我明白你在想什么,所以让我强化他的回答。您希望在 Room 对象中可以访问您的 House 名称,但 Room 不应该有 House 引用,因为 Room 组成 House,并且不应该对 House 有任何控制权,对吧?让我们假设:
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 的 const 引用放在 Room 中,这是一个“只读”对象。现在,Room 没有权力再改变 House 了。你不能在 Room 中调用 m_myHouse->demolish(),你没有那个控制权,但是 House 可以拆除任何房间。这就是House“拥有”房间的方式。