Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 组合存取_C++_Oop - Fatal编程技术网

C++ 组合存取

C++ 组合存取,c++,oop,C++,Oop,我有以下课程: 名为House的类(包含有关房屋结构的数据) 班级叫“房间”,是一个由房子组成的班级 所以当我想在房间里显示房子的名字时,问题就来了,所以为了做到这一点,我需要从room类中访问房子的名字,而这篇文章“有一个”不允许我访问 解决方法是通过构造函数将房屋名称传递给room类,但这是冗余的,因为我已经在house类中拥有了数据 另一个解决方案是继承House in Room,它不完全是“House IS A Room”,而且我将释放sugar语法来制作: House.Room

我有以下课程:

  • 名为House的类(包含有关房屋结构的数据)
  • 班级叫“房间”,是一个由房子组成的班级
所以当我想在房间里显示房子的名字时,问题就来了,所以为了做到这一点,我需要从room类中访问房子的名字,而这篇文章“有一个”不允许我访问

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

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

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”的机会。一个数据包是同时发送和接收的?@ffenix
Send
Recv
听起来就像你对一个数据包所做的事情。为什么一个
Pachets
类需要这样的组合?也许您需要重新设计?不需要,但是Send和Recv类都需要知道数据包的类型、大小和其他底层结构。Send和Recv类不是数据包的“状态”,而是保存函数名的类,按照这种顺序,用户可以使用“Packets.Send.PacketName”或“Packets.Recv.PacketName”@juanchopanza更好地引用它们,我想我拼错了name类,让它们命名为“Send_函数”和“Recv_函数”。我不是说可以发送或接收数据包;这些类仅用于用户以更结构化的方式确定数据包函数是来自“发送函数”还是“接收函数”。