C++ 组合存取
我有以下课程:C++ 组合存取,c++,oop,C++,Oop,我有以下课程: 名为House的类(包含有关房屋结构的数据) 班级叫“房间”,是一个由房子组成的班级 所以当我想在房间里显示房子的名字时,问题就来了,所以为了做到这一点,我需要从room类中访问房子的名字,而这篇文章“有一个”不允许我访问 解决方法是通过构造函数将房屋名称传递给room类,但这是冗余的,因为我已经在house类中拥有了数据 另一个解决方案是继承House in Room,它不完全是“House IS A Room”,而且我将释放sugar语法来制作: House.Room
- 名为House的类(包含有关房屋结构的数据)
- 班级叫“房间”,是一个由房子组成的班级
House.Room
所以问题是:对于这类问题,有没有标准的解决方法或重新设计模式
这里还有一个例子:
class Room {
public:
MyHouseName(); //Needs access to const char* name from House
};
class House {
const char* name
vector<Room> rooms;
};
教室{
公众:
MyHouseName();//需要从House访问const char*name
};
班房{
常量字符*名称
向量室;
};
让房间
保持一个指向拥有它的房子的指针:
class House;
class Room {
public:
MyHouseName(); //Needs access to const char* name from House
House* house;
};
class House {
const char* name
vector<Room> rooms;
};
等级住宅;
教室{
公众:
MyHouseName();//需要从House访问const char*name
豪斯*豪斯;
};
班房{
常量字符*名称
向量室;
};
虽然你不太可能真的需要这个。你到底想达到什么目的?卢钦的回答是对的,但我明白你的想法,所以让我来补充一下他的回答。您希望在房间对象中可以访问您的房子的名称,但是房间不应该有房子引用,因为房间构成了一个房子,并且不应该对房子有任何控制,对吗?让我们仰卧:
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;
};
等级住宅;
教室
{
公众:
字符串getMyHouse();//返回m_myHouse->getName();
void remove();//拆除房间
//其他方法。。。
私人:
豪斯*m_myHouse;
};
班房
{
公众:
字符串getName();
void remove();//拆除房屋,调用“m_房间”中所有房间的remove()
//其他方法。。。
私人:
向量m_室;
常量字符串m_名称;
};
正如你所见,你可以访问房子的名称,这没关系,但你也有权从一个房间里拆除房子!好的,您知道不应该在Room类中使用“m_myHouse->remove()”,但是您可以,这是一个常见的错误,它提供了对对象的更多访问,而不是必要的访问。所以这个问题的解决方案是使用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;
};
等级住宅;
教室
{
公众:
字符串getMyHouse();//返回m_myHouse->getName();
void remove();//拆除房间
//其他方法。。。
私人:
康斯特大厦*m_myHouse;
};
班房
{
公众:
字符串getName()常量;
void remove();//拆除房屋,调用“m_房间”中所有房间的remove()
//其他方法。。。
私人:
向量m_室;
常量字符串m_名称;
};
现在,House的“getName()”是const method,这意味着可以从House的const实例调用该方法,因为它不会更改对象的状态,您只需从House读取信息。“remove()”不是常量,因为它可以改变房屋的状态(拆除房屋)
所以,现在我们把房子的常量引用放在一个房间里,一个“只读”对象。现在,房间不再有能力改变房子了。您不能在房间中调用m_myHouse->remove(),您没有该控件,但House可以拆除任何房间。这就是House“拥有”房间的方式。我有一个名为Packets的类,它由Send和Recv类组成,Send和Recv类都需要Packets类中的大量数据成员。我可以继承它们,但我会失去将它们称为“Packets.Send”或“Packets.Recv”的机会。一个数据包是同时发送和接收的?@ffenixSend
和Recv
听起来就像你对一个数据包所做的事情。为什么一个Pachets
类需要这样的组合?也许您需要重新设计?不需要,但是Send和Recv类都需要知道数据包的类型、大小和其他底层结构。Send和Recv类不是数据包的“状态”,而是保存函数名的类,按照这种顺序,用户可以使用“Packets.Send.PacketName”或“Packets.Recv.PacketName”@juanchopanza更好地引用它们,我想我拼错了name类,让它们命名为“Send_函数”和“Recv_函数”。我不是说可以发送或接收数据包;这些类仅用于用户以更结构化的方式确定数据包函数是来自“发送函数”还是“接收函数”。