2011-09-30 9 views
2

이 질문은 정말 새 질문이라고 생각하지만 대답을 찾지 못했습니다. 나는 정확히이 문구를 어떻게 구별 할 수 있을지 모르지만, 나는 현재의 계층 구조와 관련하여 현재 객체와 멀리 떨어져있는 객체에 접근해야한다는 것을 자주 발견한다. 나는 이것을 단지 올바른 방법으로하고 싶다.현재 클래스 계층 구조에서 멀리 떨어져있는 객체에 액세스하는 C++

이것은 메인에서 매개 변수를 전달하는 것과 함께 사용됩니다. 필자는 주 개체와 멀리 떨어져있는 개체가 매개 변수를 여러 번 전달해야한다는 것을 알았습니다. main에서 멀리 떨어져있는 객체는 어떻게 명령 행에서 정보를 얻습니까? 4 개 클래스 제 경우를 예를 들어

...
class A{ 
    B b; 
    //need to check status of D 

    //choice 1 
    b.get_c().get_d().get_status(); 

    //choice 2 
    const C& c = b.get_c(); 
    const D& d = c.get_d(); 
    d.get_status(); 
}; 

class B{ 
public: 
    C c; 
    const C& get_c() {return c;} 
}; 

class C{ 
public: 
    D d; 
    const D& get_d() {return d;} 
}; 

class D{ 
public: 
    bool check_status(); 
}; 

남기기처럼 자동차이고, B는 도어 어셈블리, C가 D 인 잠금, 도어이다. 그런 다음 A가 잠겨 있다고 말하고 그렇지 않으면 시작을 막아야합니다.

선택 3은 A에서 D의 메소드를 직접 호출하기 때문에 C, B 및 A에서 check_status()의 몇 가지 레이어를 만들어 D, C, B.check_status()를 반환해야합니다.

코드가 좀 더 복잡한 경우 이러한 모든 하위 객체 호출은 오버 헤드가 많이 발생하지 않습니까?

감사합니다.

답변

1

이 종류의 질문에 대한 대답은 항상 동일합니다. 문제가되지 않는 한 그리고 문제가 될 때까지 걱정하지 말고 어떤 옵션이 가장 적합한 지 결정하기 위해 측정합니다. 예, 하위 객체에 대한 호출로 인해 오버 헤드가 발생하지만 예제에서 제공 한 오버 헤드는 불가피합니다 (그리고 컴파일러는 어쨌든 일부를 최적화 할 수 있습니다).

1

이 모든 함수는 클래스 정의 내에서 선언 된 이후 인라인이며 모두 return something;입니다. 그들은 참조를 반환하므로 복사본이 포함되어 있지 않습니다 (아마도 const 멤버 함수 여야합니다. 그렇지 않으면 코드가 컴파일되는 방식이 표시되지 않습니다). 오버 헤드가 전혀 없어야합니다. 코드를 컴파일하고 생성 된 어셈블리를 확인하는 것이 좋습니다.

0

음, symmety 당신은 A A const B& get_b() const에 배치하고

get_b().get_c().get_d().get_status(); 

두 choiches 완벽하게 상응하는 (실제로 동일한 코드를 생성 할 수 있으며 컴파일러 최적화)하다 할 수 있습니다.

유일한 제안은 소유자를 수정하지 않기 때문에 게터를 const X& get_x() const으로 선언하는 것입니다.

0

Large Scale C++ Software Design 사본을 얻는 위의 답변 외에도이 점에 도움이 될 수 있습니다. 요즘과는 조금 다른 첫 번째 장을 염려하지 마십시오. 제시된 아이디어의 대부분은 여전히 ​​적용 가능합니다.

0

당신처럼 체인 함수 호출의 성능에 관해서는 요즘은 함수가 간단한 const 참조를 반환 할 때 걱정하지 않아도됩니다.

그러나 가능한 디자인상의 결함으로 일반적으로 직접적인 개체로 작업하고 다른 개체의 데이터를 깊이 파지 않도록해야합니다. 비 유적으로 상인이 언제 다시 제품을 사용할 수 있는지 알고 싶으면 직접 (time = merchant.Availability(product);) 물어보고 그의 도착 날짜 (time = merchant. GetSupplyerForProduct(product). SupplySchedule(). NextArrival();)

관련 문제