0

我有以下课程:

  • 名为 House 的类(包含有关房屋结构的数据)
  • 称为 Room 的类是 House 的组成部分。

因此,当我想例如在房间中显示房子的名称时,问题就来了,所以为了做到这一点,我需要从 Room 类中访问 House 名称,其中组合“有”不会让我。

解决方法是通过构造函数将房屋名称传递给房间类,但这是多余的,因为我已经在 House 类中拥有数据。

另一个解决方案是继承 House in Room,它不完全是“House IS A Room”,而且我将放弃糖语法来制作:

House.Room

所以问题是:对于这类问题是否有标准的解决方法或重新设计模式?

这里还有一个例子:

class Room {
public:
  MyHouseName();       //Needs access to const char* name from House
};

class House {
   const char* name
   vector<Room> rooms;
};
4

2 回答 2

1

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“拥有”房间的方式。

于 2012-09-18T14:20:12.143 回答
0

Room保留指向拥有它的指针House

class House;
class Room {
public:
  MyHouseName();       //Needs access to const char* name from House
  House* house;
};

class House {
   const char* name
   vector<Room> rooms;
};

虽然你不太可能真的需要这个。你到底想完成什么?

于 2012-09-17T06:12:29.440 回答