2011-09-18 8 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: 'int *'の代わりに 'std :: vector 'を使う場合にのみ有用です。 – Nawaz

答えて

7

int*からint *constdata変更の種類:意味

int * const data; 

、それはconstメンバ関数にconstあるポインタではなく、データ自体ポインタが指すです。

data[0] = 100; //ok 

doesnのコンテンツを変更するので」:constのあるポインタ自体、それゆえ禁止を変更しようとしていますが、次が許可されているよう

data = new int[100]; //error 

:だから、次の操作を行うことはできませんポインタをに変更してください。 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はメモリ管理の問題を解決する優れたソリューションです。ここでは、それを使って、あなたが望むものを達成します。あなたはSTDを使用する必要があります::ベクトルを使用すると、int型のコレクションではなく、int型のポインタを保存したいので、実際に、なぜそれを使用しない理由

+0

+1を数秒で答えるために+1: –

+0

彼はすでに彼の最初の声明に示されていることを知っていました。 – quasiverse

+0

@quasiverse:はい。私は彼が望むものを達成する方法についても少し説明しました。 – Nawaz

4

あなたがしたいことをする方法はありません。あなたのconstメンバ関数は、データの値(それが指し示すアドレス)を変更することはできませんが、既に気づいたように指し示す内容を変更しないことについては何もありません。 std::vectorを使用すると、constメンバ関数内に実際にはconstベクトルがあり、変更可能な関数のいずれも呼び出せないので、助けになります。 constメンバ関数で

4

:これを読みますか?

また、あなたのconst'nessの問題を解決します。

これはどのように動作するのですか?メソッドconstを宣言すると、すべてのクラスメンバーがconstになります。あなたの場合は、メソッドのスコープ内でメンバーdataがintへの定数ポインタになることを意味します。つまり、dataが同じ場所を指している限り、int(配列メンバーを意味する)を変更することができます。 std::vectorを使用すると、データはconst std::vectorになり、const関数のみを呼び出すことができます。はい、std::vectorを使用してください。

+0

私は同意します。私はintのコレクションを格納したいと思います、そして、私はベクトルが正しい選択だと思う - しかし、この特定のコードは継承されています。すなわち、私はそれを書いていない。だから私はベクトルのint *を変更する気にする価値があるとは確信していません ... – karadoc

+0

に関係なく...レガシーコードは常に良いとは限りません、コードを管理している誰かに話して、 。 –

関連する問題