2011-09-18 98 views
3

顯然,仍然允許const成員函數更改類成員指向的數據。這裏是我的意思的一個例子:防止const成員函數更改成員數組

class MyClass 
{ 
public: 
    MyClass(); 
    int getSomething() const; 
private: 
    int* data; 
}; 

// ... data = new int[10];, or whatever 

int MyClass::getSomething() const 
{ 
    data[4] = 3; // this is allowed, even those the function is const 
    return data[4]; 
} 

我寧願如果這是不允許的。我應該如何定義「數據」,以便「getSomething()const」不被允許改變它? (但是爲了讓非const函數可以改變它。)對於這種情況是否有某種「最佳實踐」?也許std :: vector?

+2

是的,事實證明,const成員函數沒有你想象的那麼有用。 –

+1

@David:只有當他使用'std :: vector '而不是'int *'時,它纔會變得有用。 – Nawaz

回答

7

const成員函數,的data更改自int*int *const類型:

int * const data; 

,這意味着,它的指針是const在const成員函數,而不是數據本身的指針指向。所以你不能做到以下幾點:

data = new int[100]; //error 

因爲它試圖改變指針本身是常量,因此不允許,但下面是正確的:

data[0] = 100; //ok 

由於更改內容沒有按」 t改變指針data指向相同的內存位置。

如果你使用std::vector<int>,那麼你可以實現你想要的。事實上,向量解決了這個問題,與內存管理問題一起,爲此使用它:

class MyClass 
{ 
public: 
    MyClass(); 
    int getSomething() const; 
private: 
    std::vector<int> data; 
}; 

MyClass::MyClass() : data(10) {} //vector of size 10 

int MyClass::getSomething() const 
{ 
    data[4] = 3; // compilation error - this is what you wanted. 
    return data[4]; 
} 

不亞於你能避免非RAII設計。 RAII是內存管理問題的最佳解決方案。在這裏,你可以實現你想要的。閱讀:

+0

+ 1打我的答案,幾秒鐘:) –

+0

他已經知道,如他的第一個聲明中所示。 – quasiverse

+0

@quasiverse:是的。我還解釋了一點,關於如何實現他想要的。 – Nawaz

4

沒有辦法做你想做的。你的const成員函數不能改變數據的值(它指向的地址),但沒有關於如你已經注意到的那樣不改變它指向的內容。使用std::vector會有幫助,因爲在一個const成員函數中,你實際上會有一個const向量,不能調用它的任何可變函數。

4

的原因,你應該使用std :: vector的實際上是因爲要存儲整數的集合,而不是一個int指針,那麼爲什麼不使用它呢?

它也可以解決你的常量問題。

下面是它的工作原理:聲明一個方法const將使所有類成員爲const。在你的情況下,這意味着在方法範圍內,你的成員data將成爲一個常量指針,指向一個int。這意味着只要data指向同一位置,就可以更改int(也表示數組成員)。使用std::vector,數據將變爲const std::vector,您只能在其上調用const函數。所以是的,你應該使用std::vector

+0

我同意。我確實想存儲一個整數集合,並且我認爲向量將是正確的選擇 - 但是,這個特定的代碼是被繼承的。即。我沒有寫。所以我不確定是否值得將所有的int *改爲向量 ... – karadoc

+0

無論如何...遺留代碼並不總是好的,你應該與管理代碼的人討論並且請求改變它。 –