我有以下课程:
所以问题来了,当我想要例如在房间里显示房子的名字时,所以为了做到这一点,我需要从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;
};
答案 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;
};
虽然你不太可能真的需要这个。你到底想要完成什么?