2014-08-30 73 views
0

我正在製作一個遊戲,其中有一個Level類,用於處理向量中存儲的所有對象並更改它們。如何使const C++類訪問所有其他類的私有成員

而且我有另一個名爲Engine.h的類,它具有靜態函數,可以根據向量Level來計算事物,但不會改變它們中的任何內容。級別調用引擎功能並基於返回的內容執行操作。

但是由於Engine需要查看Level所擁有的向量,所以我被迫將向量的一串指針(const)傳遞給每個Engine函數,以便它可以根據矢量的當前狀態進行計算。

有沒有什麼辦法可以讓Engine只能訪問Level的所有成員變量,但不能編輯它們中的任何一個。某種'常朋友'?

我剛纔意識到有一個對象級別,所以我也需要有一種方法來爲引擎指定一個Level的特定對象,它可以是一個'const friend '。 也許這會變得複雜,如果沒有解決方案,將很多成員變量傳遞給Engine函數是不好的做法,或者是如何完成的。使各級成員變量常量也?)

+1

'friend'不會覆蓋'const',所以傳遞一個'常量等級*'到結識類/函數會給只讀訪問。 – 2014-08-30 13:38:59

+0

'我被迫將一堆向量的指針(const)傳遞給每個引擎函數'爲什麼你不能通過const成員函數暴露這些向量? – 2014-08-30 13:54:17

回答

1

比方說你有一些類Foox要訪問一個成員變量。你可以const功能THA按值訪問成員變量。由於它們是const,它們可能不會修改任何成員變量。

class Foo 
{ 
public: 
    Foo() : x{0} {} // constructor 

    int getX() const  { return x; } // this is a "getter" 
    void setX(int value) { x = value; } // this is a "setter" 
private: 
    int x; 
}; 

然後你可以有你的其他職業Bar。也許在某些功能需要訪問x變量Foo時,可以使用getter。

class Bar 
{ 
    void doStuff (Foo a) 
    { 
     int answer = a.getX(); 
     std::cout << answer << std::endl; 
    } 
}; 

現在我們來看一個快速演示。我們製作Foo的實例和Bar的實例。然後我們可以設置Foox值,並從BardoStuff函數中訪問它。

int main() 
{ 
    Bar myBar; 
    Foo myFoo; 

    myFoo.setX(5); 

    myBar.doStuff(myFoo); // will output 5 

    return 0; 
} 
+1

這不會給任何其他人讀取更多的讀取權限。 – 2014-08-30 13:37:55

+0

我的Game類是創建Level然後調用這些Engine函數的類。如果我將Level對象指針傳遞給每個引擎函數,我可以使用你建議的getter方法。 但是,將類的指針傳遞給引擎會乾淨嗎? 我應該使用更好的結構嗎? – Souren 2014-08-30 18:16:01

0

你可以做這樣的東西,如果有幫助:

class Level 
{ 
private: 
    std::vector<float> stuff; 

public: 

    // give outsiders const access 

    const std::vector<float>& const_stuff = stuff; // c++11 else use ctor 

    const std::vector<float>& get_stuff() const { return stuff; } // more idiomatic 
};