2009-07-17 3 views
1

私は、配列 "float ** table"を保持するクラスを持っています。今、私はそれを返すメンバ関数を持っているが、クラスの外でそれを変更したくない。だから私はこれをやった:C++関数からconst Float **を返す方法

class sometable 
{ 
    public: 
    ... 
    void updateTable(......); 
    float **getTable() const {return table;} 
    private: 
    ... 
    float **table; 
} 

私は定数オブジェクトでgetTableを呼び出すと、これはコンパイルされます。今度は、 をgetTableを "const float **getTable()"と宣言することでより安全にしようとしました。私は 次のコンパイルエラーを受け取りました:

Error: 
    Cannot return float**const from a function that should return const float**. 

なぜですか?どのようにしてクラスの側面から修正するテーブルを避けることができますか?ご希望の場合は

float const* const* getTable() const {return table;} 

または

const float* const* getTable() const {return table;} 

+0

ポインターへのポインター.....悪いデザインのように見えます。これはC++です - 'std :: vector'を使って参照を返します。 –

答えて

6

はこのようにあなたの方法を宣言します。

+0

はい、うまくいきました! (私は2番目の形式を使用しました:-) ありがとう! –

2

あなたは

const float * const * const getTable() const {return table;} 

としてあなたの方法を宣言する可能性がありますがこれでも(一番外側のconst - 関数名の隣には)それを削除しようとするクライアントを防ぐことはできませんでしょう。 代わりに参照を返すことができますが、テーブルにstd :: vectorを使用してconst refを返すのがベストでしょう - Cスタイルの配列を使用する必要がなければ

+0

"開発者は意図的にAPIを壊すよりも良いことがあります。 :) –

+0

'std :: vector'への参照を返すのは正しいですが、 –

+0

最後のconstは必要ではなく、返された値で何ができるかを変更します。 –

3

float**float const**それはconstオブジェクトを変更することができますので:

float const pi = 3.141592693; 
float* ptr; 
float const** p = &ptr; // example of assigning a float** to a float const**, you can't do that 
*p = π // in fact assigning &pi to ptr 
*ptr = 3; // PI Indiana Bill? 

CおよびC++の規則が許可されているものについては異なります。

  • C++ルールでは、星の前にconstを追加すると、次のそれぞれの前にconstを追加する必要があります。

  • Cルールでは、最後の星の前にconstを追加することしかできません。

どちらの言語でも、最後の星の前でのみconstを削除できます。

+0

まあ、私のルールは*を追加することであって、取り除くのではありません。C++だけでなくCでも、最後の星の前でconstを削除することができます(これも上記のルールに加えました)。 4.4/4を参照してください(私の例は実際には標準からのものです) – AProgrammer

+0

あなたの答えの誤解に基づいていたので、前のコメントを削除しました。 –

1

このような構文を明確に入力することはできますが、多次元配列のtypedefを定義するとはるかに読みやすくなります。

struct M { 
    typedef double* t_array; 
    typedef const double t_carray; 
    typedef t_array* t_matrix; 
    typedef const t_carray* t_cmatrix; 

    t_matrix values_; 

    t_cmatrix values() const { return values_; } 
    t_matrix values()  { return values_; } 
}; 
関連する問題