簡體   English   中英

包含類如何調用包含類的成員函數-C ++中的組成

[英]how will Contained class call member function of containing class - Composition in C++

從C ++的角度來看,這是一個通用的設計問題。 我有一個包含2個其他類的對象的容器類。

從容器類中,我們可以調用包含的類對象的方法“因為我們擁有包含的類對象的句柄”,例如objContainedClass1-> SomeMthod();。

但是我想知道包含的類對象(objContainedClass1)如何訪問容器類的方法。

我可以想到以下幾種方式:

  1. 容器類對象將指向自身的指針(此指針)傳遞給所包含的類構造函數。 使用此指針,包含的類可以訪問容器類的方法。

  2. 使容器類中的某些功能為靜態。

還有其他實現此目標的想法嗎?

謝謝

不需要,通常,類必須了解其容器是不好的設計。 通常,這意味着您違反了單一責任原則。

兩種方法都可以用於不同的目的。 如果您只需要調用靜態方法,則#2可以。 但是,如果您需要訪問容器類的實例方法,則需要具有容器類指針,因此#1是方法。

如果您需要通用解決方案,請實施觀察者模式。 在這種情況下,包含的類對容器一無所知,它僅在必要時引發事件。

有許多糟糕的選擇。

如果未在容器類之外使用包含的類,則可以使其成為容器類的一部分。

您可以使容器成為所包含類的朋友(糟糕)。

您可以將引用或boost :: shared_ptr傳遞給容器,而不是原始指針。 最佳方法取決於每種方法的壽命。 如果可以,請避免使用原始指針。

我實際上想做的是隔離包含的對象需要使用的容器方法的接口(例如IContainerCallback ),並將其用作兩者之間的鏈接。 因此,所包含的對象僅通過與容器的實現分離的接口類間接地引用容器。

  • 使容器類中的某些功能為靜態。

那就是所謂的“再見,OOP!” 選項,我盡量避免使用它。

  • 容器類對象將指向自身的指針(此指針)傳遞給所包含的類構造函數。 使用此指針,包含的類可以訪問容器類的方法。

假設包含類實現一個接口,並且包含類僅知道該接口,那么我個人看不到任何問題。 事實上,這就是我自己做的。 顯然,當例如被包含的對象在銷毀容器的方法時(或容器處於中間狀態的任何其他時間)調用容器的方法時,人們必須意識到該方法的陷阱。

為了使包含的類與包含的類進一步分離,也可以使用事件或消息。 包含的對象不知道它們的包含位置,而是發送消息。 創建包含對象時,包含對象將自身注冊為來自它們的消息的接收者。 該技術允許使對象從字面上看是獨立的,但是需要(1)一些消息傳遞框架,(2)由於C ++的靜態性質,相當復雜地實現,並且(3)還需要附加級別的文檔,因為類的接口現在包括消息傳遞。

否則,請三思,為什么所包含的對象需要調用容器的方法。 可能是您需要將一些通用功能拆分到第3類容器中嗎? 如果所包含的對象確實是活動對象並且是系統中事件的邏輯源,那么您可能確實需要一些基本的事件/消息傳遞系統,以允許容器有效地輪詢/監視所包含的對象中的狀態更改。

別。 容器類的職責是包含事物,僅此而已。 如果您需要容器類根據其中包含的內容執行操作,請讓第三個對象執行這些操作。 例如,假設您要根據類的內容重新排列或修改類的集合。 與其嘗試在所包含的類中執行此操作,不如在將容器用作依賴項的類中執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM