0

우선, 내가 원하는 용어는 "게으른로드"또는 "동적 바인딩"이 아닙니다. 나는 정확한 용어를 모르지만 내가 할 때이 질문을 편집 할 것이다.지연로드/동적 바인딩 대 안전

나는 데이터 흐름 A-를 만들 처리 객체를 연결하고있어> B :

방법 1 : 인스턴스화하는 동안 연결 코드 : https://ideone.com/Rsqabi

class Consumer { 
public: 
    virtual void consume(int data) = 0; 
}; 

class A { 
public: 
    A(Consumer& consumer) : consumer_(consumer) {} 
    void process(int data) { consumer_.consume(data); } 
private: 
    Consumer& consumer_; 
}; 

class B : public Consumer { 
public: 
    B() {} 
    void consume(int data) { /* consume data */ } 
}; 

나는 소비자 인스턴스를 가지고 있어야 인스턴스화에 편리 A :

int main() { 
    B* b_ = new B(); 
    A a_ = A(*b_); 
    a_.process(5); 
    return 0; 
} 

2 : 후 연결 인스턴스화 코드 : https://ideone.com/5ij0yZ 내가 진정으로 원하는 것은 인스턴스화 한 후 내 소비자를 선택하는 것입니다

:

class A { 
public: 
    A() {} 
    void attachConsumer(Consumer* consumer) { consumer_ = consumer; } 
    void process(int data) { 
     // must always check consumer_ here! 
     consumer_->consume(data); 
    } 
private: 
    Consumer* consumer_; 
}; 

다음 :

int main() { 
    A a_ = A(); 
    // ... for reasons I won't tell you, B must be created later than A ... 
    B* b_ = new B(); 
    a_.attachConsumer(b_); 
    a_.process(5); 
    return 0; 
} 

더 나은 모델을?

제가 참조가 유효하다는 것을 항상 알고 있기 때문에 방법 1은 좋습니다. 융통성이 없다는 것은 나쁘다.

방법 2는 소비자가 첨부 할 도로를 선택할 수 있기 때문에 좋습니다 (또는 상태를 안전하게 고려하면 다시 부착). 포인터가 위험하기 때문에 나쁘다.

두 모델 모두의 더하기를 만족하는 방법 3이 있습니까? 내 소비자가 유효하고 연결되어 있는지 항상 확인해야하는 것은 아니지만 동적 연결을 허용합니까?

모델의 차이점에 대한 올바른 용어는 무엇입니까? 나는 그것이 게으른 로딩이나 동적 바인딩이라고 생각하지 않는다. 제발 조언.

답변

0

방법 1은 A가 삭제 된 후 소비자를 릴리스해야하기 때문에 메모리 누수로 연결됩니다. 참조는 유효하지만 파괴 될 때 객체를 파괴하지 않으므로 첫 번째 방법의 이점을 제거하는 B 해제에 대해 "기억"해야합니다.

B를 공개하는 것을 두려워하는 경우 std :: shared_ptr을 사용하여 B를 보관하고 있는지 확인하십시오.

그리고 하나의 매개 변수로 생성자에 "명시 적"을 추가하는 것을 잊지 마십시오.