2009-04-18 107 views
6

我意識到有很多關於C++中的朋友類的問題。然而,我的問題與特定情況有關。鑑於下面的代碼,以這種方式使用朋友是否合適?C++朋友類

class Software 
{ 
    friend class SoftwareProducer; 

    SoftwareProducer* m_producer; 
    int m_key; 
    // Only producers can produce software 
    Software(SoftwareProducer* producer) : m_producer(producer) { } 

public: 
    void buy() 
    { 
     m_key = m_producer->next_key(); 
    } 
}; 

class SoftwareProducer 
{ 
    friend class Software; 

public: 
    Software* produce() 
    { 
     return new Software(this); 
    } 

private: 
    // Only software from this producer can get a valid key for registration 
    int next_key() 
    { 
     return ...; 
    } 
}; 

感謝,

最好的問候,

回答

8

當然,這是完全合理的。基本上你所做的與工廠模式非常相似。我看不出有什麼問題,因爲你的代碼似乎暗示每個軟件對象都應該有一個指向其創建者的指針。

雖然,通常就能避免有「經理」類,如SoftwareProducer,只是在軟件的靜態方法。因爲看起來可能只有一個SoftwareProducer。像這樣的事情也許:

class Software { 
private: 
    Software() : m_key(0) { /* whatever */ } 
public: 
    void buy() { m_key = new_key(); } 
public: 
    static Software *create() { return new Software; } 
private: 
    static int new_key() { static int example_id = 1; return example_id++; } 
private: 
    int m_key; 
}; 

然後,你可以這樣做:

Software *soft = Software::create(); 
soft->buy(); 

當然,如果你不打算有一個以上的SoftwareProducer的對象,那麼你做了什麼似乎是適當的。

1

我覺得做SoftwareProducer作爲軟件的朋友是可以接受的,但我不明白爲什麼軟件必須SoftwareProducer類的朋友。這是它們之間不必要的依賴關係。您可以將鍵作爲Software類的構造函數參數。此外,您可能希望將Software類的析構函數設置爲private,以便除SoftwareProducer之外的任何人都無法銷燬它們。

+0

我使Software成爲SoftwareProducer的一位朋友,以便訪問私有的next_key方法。 – Alex 2009-04-18 07:29:46

+0

這不是相反嗎?爲了允許從SoftwareProducer調用Software的私有構造函數,您需要使SoftwareProducer成爲Software的一位朋友,正如我所說的那樣。但是你也使軟件成爲SoftwateProducer的一個朋友,所以可以調用next_key()方法,我覺得這是不必要的。 – Naveen 2009-04-18 07:32:00

1

我不會對友誼的問題討論,但我傾向於不喜歡循環依賴。軟件取決於SoftwareProducer,它依賴於Software ...我會嘗試重構。

另請注意,友誼關係打開內部所有其他類的實例。這就是儘可能多的話說,在next_key您的評論是假的:

製作next_key私人不允許任何類從調用它,但是一旦你打開到軟件類,任何軟件可以調用next_key全部軟件生產商