2012-09-17 5 views
0

나는 다음과 같은 클래스가 : (집 구조에 대한 데이터가) 집이라고구성 액세스

  • 클래스 하우스의 구성입니다
  • 클래스라는 룸.

그래서 문제는 내가 예를 들어 방의 집 이름을 표시하고 싶습니다. 그러기 위해서 나는 어떤 방의 구성에서 "집을 가져야합니다"라는 방의 클래스에서 하우스 이름에 액세스해야합니다.

해결 방안은 생성자별로 집 이름을 전달하는 것이지만, 이미 House 클래스 안에 데이터가 있으므로 중복됩니다.

House.Room 

그래서 질문은 다음과 같습니다 :

다른 솔루션은 정확히 "하우스 방은"또한 내가 만들기 위해 설탕 구문을 잃어 버리게하지 않은 방에 집 상속 될 수있다인가 이런 종류의 문제에 대한 표준 해결책 또는 재 설계 패턴? 당신이 정말 필요가 없을 비록

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

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

: Room 그것을 소유하는 House에 대한 포인터를 유지

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

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

답변

1

루치안의 대답은 옳다. 그러나 나는 네가 생각하고있는 것을 본다. 그래서 나는 그의 대답을 강화시킨다. Room 객체에서 House의 이름을 액세스 할 수있게하려면 Room에서 House 참조를 가질 수 없기 때문에 Room이 House를 구성하고 House에 대한 제어권이 없어야합니다. 수 있습니다 supose : 당신이 볼 수 있듯이

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; 
}; 

, 당신이 집의 이름에 대한 액세스 권한을 가지고 있고, 그 괜찮아요,하지만 당신은 또한 방에서 집을 철거의 힘을 가지고! 좋아, 당신은 룸 클래스 내에서 "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; 
}; 

은 "대한 getName()"하우스 CONST 방법, 그리고이 방법은 집의 const를 인스턴스에서 호출 할 수 있다는 것을 의미, 그것은이 상태를 변경하지 않기 때문에 개체의, 당신은 단지 하우스에서 정보를 읽습니다. 그리고 "철거()"는 집의 상태를 바꿀 수 있기 때문에 const가 아닙니다 (방의 파괴).

이제 우리는 "읽기 전용"객체 인 방에 ​​집의 const 참조를 넣습니다. 이제, 방에는 더 이상 하우스를 바꿀 수있는 권한이 없습니다. 방에서 m_myHouse-> demolish()를 호출 할 수는 없지만 통제 할 수는 없지만 집에서는 모든 방을 철거 할 수 있습니다. 그게 House가 "Room"을 가지고있는 방식입니다.

0

이 유무 :

또한 여기에 예입니다. 정확히 무엇을 성취하려고합니까?

+0

나는 Send 클래스와 Recv 클래스가있는 Packets 클래스를 가지고 있는데, Send 클래스와 Recv 클래스 모두 Packets 클래스의 많은 데이터 멤버가 필요하다. 나는 그들을 상속 할 수 있지만, 나는 "Packets.Send"또는 "Packets.Recv"로 그들을 참조 할 수있는 기회를 놓치게 될 것이다. – ffenix

+0

패킷이 동시에 보내고받을 수 있습니까? – JohnB

+0

@ffenix'Send '와'Recv'는 패킷에하는 일처럼 소리가납니다.왜 '파세트'수업에는 그런 작곡이 필요한가요? 아마도 당신은 재 설계가 필요할까요? – juanchopanza

관련 문제