簡體   English   中英

與朋友 class 在 C++ 中的命令設計模式

[英]Command design pattern with friend class in C++

情況:我必須處理各種命令並采取行動,這些命令可以封裝在命令設計模式中。 所以現在我有

class Command {
    virtual void applyCommand(IFoo& foo) = 0;
    virtual ~Command() = default;
};

當然,我將此接口繼承到我的各個命令類中。

然而現在,我意識到僅僅通過IFoo是不夠的。 我希望能夠訪問我的ConcreteFoo class 中的私有數據成員。 我證明這種封裝中斷是合理的,因為歸根結底,所有這些對象基本上只是我的ConcreteFoo class 的輔助函數。 我對它們強耦合感到滿意,因為一種或另一種方式,我必須編寫這些方法,並且執行 CDP 使其更具可讀性。

因此,我將 class 更改為

class Command {
    virtual void applyCommand(ConcreteFoo& foo) = 0;
    virtual ~Command() = default;
};

在我的 ConcreteFoo class 我聲明

friend class Command;

然而,友誼顯然沒有被繼承到 Command 的子類中,即實際執行工作的類中。 所以我實際上無法訪問我需要的數據。

我目前解決這個問題的想法是:

1.) 拿 L 並在沒有 CDP 的情況下處理這個

  • 可能,但如果我能避免的話,我真的不想走這條路

2.) 將 ConcreteFoo 中的數據成員公開

3.) 使 ConcreteFoo 中的數據成員受保護,並以某種方式使 Command 成為 ConcreteFoo 的子類

4.) 手動將每個 Command 子類聲明為朋友,所以喜歡

friend class CommandA;
friend class CommandB;
friend class CommandC;
friend class CommandD;
...
  • 體面,但可能無法很好地擴展。 從好的方面來說,如果我忘記加好友,它應該會在編譯時失敗

這些選項都不是特別吸引我。 還有什么我可以做的嗎?

您基本上正在研究訪問者模式(您的 Command class 是 Foo 類的訪問者)。

go 解決這個問題的一種方法是,您可能有一個命令的公共接口( applyCommand非虛擬)和虛擬實現( applyCommandImpl虛擬)。 您可以使Command本身成為朋友,並且Command::applyCommand可以提取必要的數據並將其傳遞給特定的applyCommandImpl

通常,您只需提取必要的參數並傳遞它們。 但是,如果您真的想訪問所有成員,那么您可以這樣做:將 Foo 的成員放在一個結構中(例如, Foo1DO ,如數據對象中)並從它私有繼承以獲得Foo1 然后你可以有一個簡單的 getter 從Foo1中的applyCommand Foo1DO

暫無
暫無

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

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