0

首先,我認爲我想要的術語既不是「延遲加載」也不是「動態綁定」。我不知道正確的術語,但是當我這樣做時我會編輯這個問題。延遲加載/動態綁定vs安全

我連接處理對象來創建數據流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 */ } 
}; 

我必須有一個消費者實例方便實例化 - 答:

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,從而消除了第一種方法的優點。

使用std :: shared_ptr來保存B,如果你害怕忘記釋放B,並且想確保持有它。

不要忘記添加「顯式」的構造函數與一個參數。