0

私は次のクラスを持っています:

  • Houseと呼ばれるクラス(家の構造に関するデータがあります)
  • ハウスの構成であるルームと呼ばれるクラス。

たとえば、部屋の家の名前を表示したい場合に問題が発生します。そのためには、「持っている」構成では許可されない部屋のクラスから家の名前にアクセスする必要があります。

回避策は、コンストラクターによって家の名前を部屋のクラスに渡すことですが、私はすでに家のクラス内にデータを持っているので、それは冗長です。

もう1つの解決策は、HouseinRoomを継承することです。これは正確には「HouseISARoom」ではなく、砂糖の構文を緩めて作成します。

House.Room

したがって、問題は次のとおりです。この種の問題に対する標準的な回避策または再設計パターンはありますか?

また、ここに例があります:

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

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

2 に答える 2

1

ルチアンの答えは正しいですが、あなたが何を考えているかわかりますので、彼の答えを補強させてください。Roomオブジェクトで家の名前にアクセスできるようにしたいのですが、部屋は家を構成し、家を制御することはできないため、部屋に家の参照を含めることはできません。仮定しましょう:

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インスタンスから呼び出すことができます。これは、オブジェクトの状態を変更しないため、Houseから情報を読み取るだけです。また、「demolish()」は、家の状態を変更する(部屋を解体する)可能性があるため、constではありません。

そこで、「読み取り専用」オブジェクトであるHouse inaRoomのconst参照を配置します。今、部屋はもう家を変える力を持っていません。Roomでm_myHouse->demolish()を呼び出すことはできません。その制御はできませんが、Houseは任意の部屋を取り壊すことができます。それがハウスが「部屋を持っている」方法です。

于 2012-09-18T14:20:12.143 に答える
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;
};

可能性は低いですが、本当にこれが必要になることはありません。正確に何を達成しようとしていますか?

于 2012-09-17T06:12:29.440 に答える