2011-09-18 65 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

无论如何...遗留代码并不总是好的,你应该与管理代码的人讨论并且请求改变它。 –