2016-11-30 68 views
1

假設我有一個具有一些成員屬性的類A, A也有一個帶有B類對象的向量(std::vector<B>)。那些B對象需要一些屬性(比如說5)。我看到了兩種處理方法:C++類的設計:在其他類成員中共同使用類成員;小界面vs小班

1)讓B引用這些屬性,並在B的構造函數中賦值它們。

2)讓B只有一個對象的引用,並通過公共getAttributeXYZ()函數獲取屬性。

我可以看到解決方案1)技術上對A的瞭解較少,因此它更好,因爲它不能調用某個錯誤的函數。但我覺得2)更清晰,因爲構造函數更小,B類本身具有更少的(引用)屬性。有一個更好的方法,還是取決於細節?

上下文:在我的程序中,A的那些成員是可以由所有B對象共享的用於紋理管理,文本繪製等的類。

+1

我不遵循#1對A的瞭解程度的邏輯。如果它直接引用屬性,它仍然依賴於A.事實上,它更是如此,因爲它依賴於* private *實現A的細節,而如果你只是存儲了一個對A的引用並且調用了public accessor函數,那麼A和B之間的依賴關係就會減少。我還會爭辯說,試圖最小化兩個*邏輯上依賴的事物之間的依賴關係是一個練習在愚蠢。使用最清晰的設計,即使它不是理論上最純的設計。 –

+1

「有沒有更好的方法還是取決於細節?」:我們如何知道細節而不知道? :)這就是爲什麼一個好問題應該被合成爲[MCVE](http://stackoverflow.com/help/mcve),而不是一個普遍的問題 – wasthishelpful

回答

3

在這種情況下,您可以吃蛋糕,也可以將B僅限於A的相關子集。有很多方法可以解決這個問題。

一,聚集在一個專用的類屬性:

struct A 
{ 
    struct SharedData 
    { 
    int data; 
    // ... 
    }; 

    A(); 

private: 
    SharedData sharedData; 
    std::vector<B> bs; 
    // other data here 
}; 

struct B 
{ 
    B(A::SharedData *data) : data{data} {} 

private: 
    A::SharedData *data; 
}; 

A::A() : bs{B{&sharedData}} {} 

兩個,給A專用接口來訪問這些屬性:

struct SharedDataInterface 
{ 
    virtual int getData() const = 0; 
}; 

struct A : SharedDataInterface 
{ 
    int getData() override { return sharedData; } 

    A(); 

private: 
    std::vector<B> bs; 
    int sharedData; 
    // other data here 
}; 

struct B 
{ 
    B(SharedDataInterface *data) : data{data} {} 

private: 
    SharedDataInterface *data; 
}; 

A::A() : bs{B{this}} {} 

我對這個話題相信其他變化也是可能的。