gpt4 book ai didi

c++ - 组合访问

转载 作者:行者123 更新时间:2023-11-28 07:57:07 24 4
gpt4 key购买 nike

我有以下类(class):

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

所以当我想要例如在房间中显示房子的名称时,问题就来了,所以为了做到这一点,我需要从 Room 类访问房子名称,而组合“有一个”不允许我这样做。

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

另一个解决方案是继承房间中的房子,这不完全是“房子是一个房间”,而且我会放宽糖语法来制作:

House.Room

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

还有一个例子:

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

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

最佳答案

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实例中调用,因为它不会改变对象的状态,你只是读取一个信息来自众议院。而“demolish()”不是const,因为它可以改变房子的状态(拆除它的房间)。

所以,现在我们将 House 的 const 引用放在 Room 中,这是一个“只读”对象。现在,Room 已经没有改变 House 的权力了。你不能在 Room 中调用 m_myHouse->demolish(),你没有那个控制权,但是 House 可以拆除任何房间。这就是众议院“拥有”房间的方式。

关于c++ - 组合访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12453915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com