作文访问

时间:2012-09-17 06:10:32

标签: c++ oop

我有以下课程:

  • 称为House的类(有关房屋结构的数据)
  • 被称为House的房间,是House的组成。

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

解决方法是通过构造函数将房屋名称传递给房间类,但这是冗余,因为我已经拥有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;
};

2 个答案:

答案 0 :(得分:1)

Luchian的答案是对的,但我看到你在想什么,所以让我强化他的答案。你希望你的房子的名字可以在房间对象中访问,但房间不应该有房屋参考,因为房间组成房子,不应该对房子有任何控制权,对吧?让我们说:

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-&gt; 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。并且“拆除()”不是常数,因为它可以改变房屋的状态(拆除房间)。

所以,现在我们将House的const引用放在Room中,这是一个“只读”对象。现在,Room无法再改变房子了。你不能在房间里调用m_myHouse-&gt; demolish(),你没有那个控制权,但House可以拆除任何房间。那就是House“有一个”房间。

答案 1 :(得分: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;
};

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