2015-08-22 38 views
0

在我的程序中,我有一個名爲Foo的數據結構。該程序的一部分從一組參數構造Foo,因此需要訪問變異方法。該程序的另一部分將只從Foo讀取,因此不應該有權訪問變種方法。C++:一類的只讀和只寫版本的語義

什麼是最好的方法來實現這一目標,或者我錯誤地認爲類應該如何工作?我用這種方式在過去:

class FooR { 
public: 
    int read() { return x; } 
protected: 
    int x; 
}; 

class FooRW : public FooR { 
    void mutate(int nx) { x = nx; } 
}; 

可是這樣感覺就像你濫用繼承,我認爲這可能會造成混亂已經在計劃中的兩個部分兩個非常相似命名類。有更好的方法嗎?您能否以一些棘手的方式使用const

編輯: @jens指出,使用該程序的只讀部分const引用應該工作,這讓我意識到要知道,我的數據結構實際上是一棵樹是很重要的,是這樣的:

class Foo { 
public: 
    void splitNode(); 
    Foo *getChild(int n) const; // const Foo? 
private: 
    Foo *children[2]; 
}; 

是否有強迫const Fooconst引用返回到其子女的一種方式?

+0

這看起來像一個反模式,如果我見過一個。 – CoryKramer

+4

爲什麼不給'const Foo'給只讀部分,'Foo'給不是的部分? – Barry

+2

如果您只需要在創建時寫入,您也可以擁有一個擁有「朋友」權限的工廠。建設者模式也可能工作,但我認爲這是一種工廠。 – Carcigenicate

回答

4

你的程序中不需要改變對象的部分應該只是usr的const引用,並且將非變異的成員函數標記爲const。

class FooR { 
public: 
    int read() const { return x; } 
    void mutate(int nx) { x = nx; } 
private: 
    int x; 
}; 

void f1(FooR const& obj) 
{ 
    int x = obj.read(); 
    // cannot use obj.mutate(x+1); 
} 
void mutatingFunction(FooR&); 

你可以做建設在工廠或建造,並返回一個std::unique_ptr<FooR const>std::shared_ptr<FooR const>以防止其他人使用,突變界面。

相同的方法適用於樹。聲明一個const重載返回Foo const*,以及一個非const重載返回一個非const指針。後面的一個不能用於const引用。

class Foo { 
public: 
    void splitNode(); 
    Foo const* getChild(int n) const; 
    Foo* getChild(int n); 
private: 
    Foo *children[2]; 
}; 
+0

我喜歡const的想法!然而,它讓我意識到我需要更多地解釋'Foo',因爲我意識到'const'方法可能存在問題,我編輯了我的文章。 – bombax

+0

@bombax我編輯了這篇文章,包括你的樹。 – Jens

+0

完美,謝謝! – bombax