2016-07-21 43 views
-2

這可能是非常基本的,但不知何故我無法弄清楚。如何使數據可用於一個類的所有對象?

說我有一類A其中嵌入了42個Thing S,再加上一些常見的數據:

class A { 
    Thing things[42]; 
    int common_data[1024]; 
} 

我希望每個thing有權訪問公共數據,但我不希望複製數據在每個Thing對象中,也不會在每個事物中支付指針的價格。換句話說,我想Thing看起來像這樣:

class Thing { 
    int ident; 
    int f() { 
    return common_data[ident]; 
    } 
} 

當然這裏common_data綁定。什麼是使這項工作的規範方式?我正在使用C++的子集,沒有動態分配(沒有「新」,沒有繼承,基本上它是用調用方法和聲明對象的好語法的C);我理想的是尋找適合這個子集的解決方案。

+4

使其成爲靜態會員 – user463035818

+0

@ tobi303 ...類「事」?但後來我無法從'A'訪問它,對吧? – mqtthiqs

+0

在相關時將'common_data'傳遞給'Thing'方法。 – StoryTeller

回答

1

您可以通過A類靜態的common_data屬性解決您的問題。靜態變量由類A的所有成員共享,並且如果公開使用,則可以訪問它們。

class A 
{ 
    private: 
    Thing things[42]; 
    public: 
    static int common_data[1024]; 
} 

它可以通過做訪問...

A::common_data[index]; 
+0

再次感謝你們倆! – mqtthiqs

1

我不知道如果我理解正確的問題,但也許這會有所幫助:

struct A { 
    Thing things[42]; 
    int common_data[1024]; 
    void foo(int index) { 
     things[index].doSomeThingWithCommonData(int* common_data); 
    } 
}; 

struct Thing { 
    void doSomeThinWithCommonData(int* common_data) { 
     /* now you have access to common_data */ 
    } 
}; 
+0

謝謝你的幫助@ tobi303。解決方案的問題在於,每次需要時都必須顯式傳遞數據作爲參數(如果您沒有類,例如在C中,必須顯式傳遞數據作爲參數)。我正在尋找的是我的函數'f'或函數'doSomethingWithCommonData'的一種方式,不要將數據作爲參數,而是已經在範圍內,就好像它是一個字段(或者甚至:以某種方式使它成爲字段,但保留'A'的訪問權限)。 – mqtthiqs

+0

@mqtthiqs你的課堂設計似乎有問題。如果你擔心傳遞數據,那麼1)認爲它是通過引用傳遞的(即不涉及拷貝)2)你可以做任何「Thing」應該直接在'A :: foo'中做的事情(但是那麼'A'可能需要訪問'Things'的私人成員) – user463035818

+0

@ tobi303他表示他不想在之前的評論中複製指針。如果你通過引用傳遞它將複製每個實例的指針。我真的不知道如何做到這一點,除了有一個靜態類,或通過引用,如你所建議的。 – Taztingo

0

你的原因,以避免指針/引用是基於非理性的恐懼。對於機器,「複製」指針42次是沒有任何(仔細閱讀此字)。而且這絕對是而不是的應用瓶頸。

所以慣用的方法是簡單地使用依賴注入,這的確是對你稍微昂貴的動作(如果傳遞一個數組可以考慮昂貴),但允許更多的解耦設計。因此

這是我推薦的解決方案:

struct Thing { 
    using data = std::shared_ptr<std::array<int, 1024>>; 
    data common_data; 
    Thing(data arg) 
     : common_data(arg) 
     {} 
    // ... 
}; 

如果系統costrained,那麼你應該基準程序。我幾乎可以絕對肯定地告訴你,瓶頸不會是複製那些42個指針。

相關問題